<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Editieren&#x2F;Korrigieren einer Zelle im DBGrid]]></title><description><![CDATA[<p>Hallo</p>
<p>Nach dem Laden der Datenbank kann ich in einem DBGrid auf die Einträge (AnsiString) einer Datenbanktabelle zugreifen.</p>
<p>Die Einträge sind stark vereinfacht wie folgt aufgebaut CCC999999 (C=alphanumerisch, 9=numerisch). Um das beizubehalten soll der Editiervorgang im DBGrid überwacht werden. Hierzu verwende ich die Ereignisse <strong>DataSet::BeforeEdit</strong>, bzw. <strong>DataSet::BeforePost</strong>.<br />
Bei DataSet::BeforeEdit greife ich den Eintrag der gerade angeklickten Zelle mit DBGrid-&gt;SelectedField-&gt;AsString ab und speichere ihn als tempStr im <strong>private</strong> Bereich der TForm1 ab.<br />
Beim Ereignis DataSet::BeforePost prüfe ich mit einer Funktion EingabeOk ob der editierte veränderte AnsiString der gewünschten Form entspricht.<br />
Wenn der Eintrag nicht dem vorgegebenen Schema entspricht, soll er durch Rückspeichern von tempStr überschrieben werden und der alte Zustand wieder hergestellt werden.</p>
<p>Das Zurückspeichern klappt. Wenn ich aber dann vom Editiermodus &quot;<strong>I</strong>&quot; umschalte, z.B. indem ich auf eine andere Zelle klicke, bekomme ich folgende Exception:</p>
<p>EOle Exception &quot;Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf geändert&quot;</p>
<p><strong>Was mache ich falsch? Gibt's vielleicht noch eine bessere Möglichkeit als das, was ich beschreibe?</strong> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">// Zellinhalt zwischenspeichern
void __fastcall TForm1::ADODataSet1BeforeEdit(TDataSet *DataSet){
   tempStr = DBGrid1-&gt;SelectedField-&gt;AsString;
}

//Zurückspeichern
void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet){
  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    DBGrid1-&gt;SelectedField-&gt;AsString = tempStr; 
    Abort();
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/186636/editieren-korrigieren-einer-zelle-im-dbgrid</link><generator>RSS for Node</generator><lastBuildDate>Sun, 16 Aug 2026 16:55:48 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/186636.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 10 Jul 2007 22:56:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Tue, 10 Jul 2007 22:56:26 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Nach dem Laden der Datenbank kann ich in einem DBGrid auf die Einträge (AnsiString) einer Datenbanktabelle zugreifen.</p>
<p>Die Einträge sind stark vereinfacht wie folgt aufgebaut CCC999999 (C=alphanumerisch, 9=numerisch). Um das beizubehalten soll der Editiervorgang im DBGrid überwacht werden. Hierzu verwende ich die Ereignisse <strong>DataSet::BeforeEdit</strong>, bzw. <strong>DataSet::BeforePost</strong>.<br />
Bei DataSet::BeforeEdit greife ich den Eintrag der gerade angeklickten Zelle mit DBGrid-&gt;SelectedField-&gt;AsString ab und speichere ihn als tempStr im <strong>private</strong> Bereich der TForm1 ab.<br />
Beim Ereignis DataSet::BeforePost prüfe ich mit einer Funktion EingabeOk ob der editierte veränderte AnsiString der gewünschten Form entspricht.<br />
Wenn der Eintrag nicht dem vorgegebenen Schema entspricht, soll er durch Rückspeichern von tempStr überschrieben werden und der alte Zustand wieder hergestellt werden.</p>
<p>Das Zurückspeichern klappt. Wenn ich aber dann vom Editiermodus &quot;<strong>I</strong>&quot; umschalte, z.B. indem ich auf eine andere Zelle klicke, bekomme ich folgende Exception:</p>
<p>EOle Exception &quot;Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf geändert&quot;</p>
<p><strong>Was mache ich falsch? Gibt's vielleicht noch eine bessere Möglichkeit als das, was ich beschreibe?</strong> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<pre><code class="language-cpp">// Zellinhalt zwischenspeichern
void __fastcall TForm1::ADODataSet1BeforeEdit(TDataSet *DataSet){
   tempStr = DBGrid1-&gt;SelectedField-&gt;AsString;
}

//Zurückspeichern
void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet){
  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    DBGrid1-&gt;SelectedField-&gt;AsString = tempStr; 
    Abort();
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1322683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322683</guid><dc:creator><![CDATA[thunderbol4]]></dc:creator><pubDate>Tue, 10 Jul 2007 22:56:26 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Wed, 11 Jul 2007 07:25:55 GMT]]></title><description><![CDATA[<p>Hat die Tabelle auf der du zugreifst einen primären Schlüssel?<br />
falls nicht erstelle mal einen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1322790</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1322790</guid><dc:creator><![CDATA[VergissEs]]></dc:creator><pubDate>Wed, 11 Jul 2007 07:25:55 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Wed, 11 Jul 2007 22:48:25 GMT]]></title><description><![CDATA[<p>Hallo <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/887">@VergissEs</a><br />
Die Tabelle hatte keinen Primärschlüssel.<br />
Also habe ich auf deinen Vorschlag hin den in meiner MySQL-Tabelle eingefügt und das Ganze nochmal laufen lassen. Leider auch dann ohne Erfolg.</p>
<p>Ich habe in der ADODataSet1BeforePost mit dem Debugger einen Breakpoint gesetzt. Die Exception tritt erst auf, wenn die Routine verlassen wird.</p>
<p>Gibt's noch weitere Tipps? Oder komme ich um die Exception nicht herum?</p>
<pre><code class="language-cpp">void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet){
  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    DBGrid1-&gt;SelectedField-&gt;AsString = tempStr;
    Abort();      // ==&gt;Breakpoint, okay, F8
  }               // ==&gt;okay, F8
}                 // ==&gt;okay, F8
                  // ==&gt;Exception (s. oben)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1323467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1323467</guid><dc:creator><![CDATA[thunderbol4]]></dc:creator><pubDate>Wed, 11 Jul 2007 22:48:25 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Thu, 12 Jul 2007 08:33:36 GMT]]></title><description><![CDATA[<p>Was soll die Funktion Abort() dort?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1323623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1323623</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Thu, 12 Jul 2007 08:33:36 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Thu, 12 Jul 2007 17:30:25 GMT]]></title><description><![CDATA[<p>Hallo <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9348">@Th</a>,<br />
ich habe Abort() deshalb genommen, weil ich in einem Beispiel aus der BCB-Hilfe folgendes gefunden habe:</p>
<p>*In diesem Beispiel wird geprüft, ob ein TDBEdit-Steuerelement einen gültigen Eintrag enthält. Ist das Steuerelement leer, wird die Prozedur Abort aufgerufen, um das Eintragen zu verhindern.</p>
<p>void __fastcall TForm1::Table1BeforePost(TDataSet *DataSet)</p>
<p>{<br />
if (DBEdit1-&gt;Text == &quot;&quot;)<br />
Abort();<br />
}*</p>
<p>Wie man sieht, besteht zwischen meinem Konstrukt und diesem Beispiel eine große Ähnlichkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> , demzufolge kann das auch sicher nicht so verkehrt sein.<br />
Also so wie ich das sehe, liegt mein Fehler irgendwo in der Zuweisung bei</p>
<pre><code class="language-cpp">DBGrid1-&gt;SelectedField-&gt;AsString = tempStr;
</code></pre>
<p>Ich denke, dass hier etwas faul ist. Allerdings wüßte ich nicht, wie ich sonst der falsch bearbeiteten Zelle den alten Wert zurückgeben könnte? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1324073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324073</guid><dc:creator><![CDATA[thunderbol4]]></dc:creator><pubDate>Thu, 12 Jul 2007 17:30:25 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Fri, 13 Jul 2007 09:03:18 GMT]]></title><description><![CDATA[<p>Normalerweise wird die Methode Cancel() verwendet, um die geänderten Werte zu verwerfen und in den Browse-Modus zurückzukehren.<br />
Ok, Abort() ist richtig, da es die Exception EAbort wirft.</p>
<p>Was passiert denn, wenn du nur folgendes benutzt?</p>
<pre><code class="language-cpp">void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet)
{
  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString))
  {
    Abort();
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1324445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1324445</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Fri, 13 Jul 2007 09:03:18 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Sun, 15 Jul 2007 08:45:26 GMT]]></title><description><![CDATA[<p>Hallo <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9348">@Th</a>,<br />
vielen Dank für Deine Hilfestellung, habe Deinen Rat befolgt und 'mal alles rauskommentiert, was geht:</p>
<pre><code class="language-cpp">void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet){

  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
  }; //funktioniert, klar weil Compiler diese Passage löscht

  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    Abort(); //bleibt im Editiermodus in der falsch formatierten Zelle hängen u stürzt mit Exception ab, wenn das Format richtig korrigiert ist
  };         //&quot;Die zum Aktualisieren angegebene Zeile wurde nicht gefunden. Einige Werte wurden seit dem letzten Lesen ggf geändert&quot; 

  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    ADODataSet1-&gt;Cancel(); //s. unten
  };
}
</code></pre>
<p>Leider funktioniert auch Cancel() nicht richtig. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wenn ich in meinem DBGrid eine Zelle so editiere, dass die Eingabeform falsch ist, speichert die Funktion Cancel() den alten Wert zurück.<br />
Soweit so gut. Leider speichert sie diesen Wert nicht nur 1x sondern 2x zurück. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p>Das Ganze sieht dann in etwa so aus:<br />
Zelle vorher:<br />
<strong>CCC9999</strong><br />
dann Zelle absichtlich falsch formatiert<br />
<strong>CCC9999§§§</strong></p>
<p>So sieht das DBGrid nach Korrektur durch Cancel() aus:<br />
..<br />
<strong>CCC9999</strong> (erster Eintrag) &lt;--Zeilenposition der ursprünglichen Zelle<br />
CCC5654<br />
CCC1234<br />
..<br />
<strong>CCC9999</strong> (zweiter Eintrag) &lt;--letzte Zeile im Grid</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1325667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1325667</guid><dc:creator><![CDATA[thunderbol4]]></dc:creator><pubDate>Sun, 15 Jul 2007 08:45:26 GMT</pubDate></item><item><title><![CDATA[Reply to Editieren&#x2F;Korrigieren einer Zelle im DBGrid on Wed, 18 Jul 2007 19:12:55 GMT]]></title><description><![CDATA[<p>Hallo Leute, komme gerade hier ins Forum rein und sehe Eure tumultartig rege Anteilnahme an meinem superspannenden Thread! Erinnert mich ein bißchen ans Schweigen im Walde. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Naja es sei nochmals verziehn, ich schieb's 'mal auf die derzeit lähmende Hitze :D, bei der man doch sicher was anderes macht als nur am Computer rumhocken.</p>
<p>Und weil ich trotzdem so ein netter Kerl bin, wollte ich Euch die Lösung, die ich eigentlich von Euch erwartet hätte, nicht vorenthalten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> :</p>
<pre><code class="language-cpp">void __fastcall TForm1::ADODataSet1BeforePost(TDataSet *DataSet){
  if (!EingabeOk(DBGrid1-&gt;SelectedField-&gt;AsString)){
    ADODataSet1-&gt;Cancel();
    Abort();
  };
}
</code></pre>
<p>Fazit:<br />
Das Zurückschreiben in die Zelle mit</p>
<pre><code class="language-cpp">DBGrid1-&gt;SelectedField-&gt;AsString = tempStr;
</code></pre>
<p>klappt definitiv nicht. Die dabei auftretende Exception kriege ich einfach nicht los.</p>
<p>die Lösung von <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9348">@Th</a> nur mit Cancel() zu arbeitern, klappt in BeforePost() deshalb nicht, weil Cancel() zum 1. Mal den Inhalt in die Zelle schreibt und dann BeforePost() ein 2.Mal in eine weitere Zelle.</p>
<p>Demzufolge muß die Lösung sein mit Cancel() den Eintrag zurückzuschreiben und mit Abort() vorzeitig aus der Routine auszusteigen, damit nicht nochmals ein weiterer Eintrag erfolgt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1328024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1328024</guid><dc:creator><![CDATA[thunderbol4]]></dc:creator><pubDate>Wed, 18 Jul 2007 19:12:55 GMT</pubDate></item></channel></rss>