StringGrid bei Änderung aktualisieren
-
Hallo zusammen,
ich arbeite mit einer datenbank und einem StringGrid.
Wenn ich nun Änderungen in der Datenmenge, die aus der DB kommt, habe, will ich diese Änderungen auch direkt im StringGrid anzeigen lassen.Wie kann ich dieses anstellen? Habe was von OnDrawCell gelesen, weis aber nicht, ob das der richtige Ansatz ist
-
Deinen bisherigen Posts nach ist DrawCell vermutlich der falsche Ansatz.
Woher kommen diese Änderungen denn? Wenn möglich, solltest versuchen beim Ausführen des Updates / Inserts auch gleich das StringGrid mit zu aktualisieren. Ob nun per direktem Zugriff, oder über eine Funktion, die praktisch nur den geänderten Datensatz neu einliest, hängt von der bisherigen Implementation ab.
Wieso verwendest Du kein TDDGrid?
-
ich benutze das StringGrid, weil ich mehr als nur eine Zeile der Datenbank anzeigen möchte.
Sind meistens zwei Datensätze pro Zeile und manchmal halt auch nur einer.Der Hintergrund ist folgender:
ich habe ein StringGrid mit Datensätzen drin.
Oben drüber zwei Buttons um Monate durchzuschalten.
Wenn man nun z.B. den Button für den nächsten Monat auswählt, werden aus der Datenbank alle Kontobewegungen für diesen dann gewählten Monat geladen und sollen dann im StringGrid eingetragen werden.Die Monate werden korrekt selektiert und ausgegeben (in nem Label zwischen den Buttons). Leider verändert sich das StringGrid nicht.
In Java habe ich das genauso gemacht, nur gab es da eine Funktion, der man die aktuellen Werte gegeben hat und die hat die Tabelle dann mit den neuen Daten neu aufgebaut.
Habe das Äuivalent dazu in C++ leider nur noch nicht gefunden.
-
ich benutze das StringGrid, weil ich mehr als nur eine Zeile der Datenbank anzeigen möchte.
Sind meistens zwei Datensätze pro Zeile und manchmal halt auch nur einer.Da kannst du trotzdem TDBGrid verwenden. Verstehe nicht, was sich da beissen sollte.
-
Padde85 schrieb:
Die Monate werden korrekt selektiert und ausgegeben (in nem Label zwischen den Buttons). Leider verändert sich das StringGrid nicht.
In Java habe ich das genauso gemacht, nur gab es da eine Funktion, der man die aktuellen Werte gegeben hat und die hat die Tabelle dann mit den neuen Daten neu aufgebaut.
Habe das Äuivalent dazu in C++ leider nur noch nicht gefunden.Naja, die Änderungen am StringGrid mußt du ja auch selbst programmieren. Das StringGrid kann sich nicht selbst aktualsieren. Am besten eine kleine Funktion der du die Daten (z.B. in Form eines DataSet) und das verwendete StringGrid übergibst und dann einfach das Füllen des StringGrid, was du ja schon mindestens einmal haben mußt, dort rein. Dann die ganze Funktion immer aufrufen wenn du neue/aktualisierte Daten abgerufen hast. Was ist daran so schwer?
-
Hallo
Und wenn du es manuell machen willst, dann must du das StringGrid eben auch manuell aktualisieren. Sprich im auslösenden Button-Event den alten Inhalt des StringGrid löschen und die neuen Daten aus der Datenbank wieder ins StringGrid einfügen.
Das muß bei Java auch so gemacht werden, es sei denn du benutzt sogenannte datensensitive Komponenten. Die vereinfachen das ganze sehr, und in deinem Fall würde eben das schon angesprochene TDBGrid das passende sein (in Verbindung mit einem passenden TQuery als Datenquelle)bis bald
akari
-
Padde85 schrieb:
ich benutze das StringGrid, weil ich mehr als nur eine Zeile der Datenbank anzeigen möchte.
Sind meistens zwei Datensätze pro Zeile und manchmal halt auch nur einer.Ja, und? Wieso solltest kannst Du dann kein TDBGrid verwenden können?
Padde85 schrieb:
Der Hintergrund ist folgender:
Wenn man nun z.B. den Button für den nächsten Monat auswählt, werden aus der Datenbank alle Kontobewegungen für diesen dann gewählten Monat geladen und sollen dann im StringGrid eingetragen werden.Wenn es sowieso nur ein oder zwei Datensätze sind, warum baust Du nicht einfach das ganze StringGrid neu auf?
Und nochmal die Frage, warum Du kein TDBGrid verwendest?Padde85 schrieb:
In Java habe ich das genauso gemacht, nur gab es da eine Funktion, der man die aktuellen Werte gegeben hat und die hat die Tabelle dann mit den neuen Daten neu aufgebaut.
Habe das Äuivalent dazu in C++ leider nur noch nicht gefunden.Welche Tabelle? Die Datenbanktabelle? Und welche geänderteten Werte? Für mich liest sich das eher so, als würdest Du nur andere Datensätze anzeigen wollen und nicht auf die Änderung von Daten in der Datenbank reagieren wollen (so liest sich das zumindest in dem Ursprungspost)?
Und noch mal die Frage, warum verwendest Du kein TDBGrid? Für mich macht es ganz, ganz stark den Eindruck, als wärst Du gerade dabei, ein TStringGrid zu einem TDBGrid umzubauen... Warum das Rad neu erfinden?
-
Padde85 schrieb:
...Leider verändert sich das StringGrid nicht. ...
Ich würde auch DBGrid nehmen und es über die DataSource an ein DataSet binden. Wenn der Benutzer auf die Buttons klickt dann halt das DataSet schließen, SQL mit neuem Monat angeben oder Parameter verwenden und dann halt das Teil wieder öffnen. Das DB-Control müßte dann die neuen Daten darstellen.
-
@witte: Muss man denn zwangsläufig die DataSource schließen? Wenn man mit Paramentern arbeitet, sollte es doch reichen, den Parameter neu zu setzen.
-
Ich habe das mal mit Wireshark überprüft. Wenn ich das Open/Close auskommentiere, werden keine Datenpakete an die DB gesendet.
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { cdsM->Params->Items[0]->Value = 0; cdsM->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::dtpChange(TObject *Sender) { //cdsM->Close(); cdsM->Params->Items[0]->Value = dtp->Date; cdsM->Open(); } //---------------------------------------------------------------------------
-
mir scheint, wenn ich das so lese, dass ich falsch informiert worden bin.
Habe von nem Kumpel, der schon länger mit C++ programmiert, dass das TDBGrid sich fast genauso wie das TTable verhält und das zeigt ja einfach immer nur einen datensatz pro Zeile an und mehr nicht.
Aber dannw edre ich das zu hause mal umstellen und schauen, ob dann das passiert was ich machen will.
@Joe:
Ich will im Grid (jetzt mal egal welches) sowohl geänderte daten, also zum Beipsiel ne Kontobewegung falsch eingegeben und nachträglich geändert, aber auch bestehende daten aus der DB anzeigen.Hast das also richtig aus dem Eingangspost rausinterpretiert