DBGrid: Position ermitteln und nach neuladen wieder "hinspringen"?
-
Hallo Zusammen,
ich habe in meinem Programm ein DBGrid in dem ich Daten aus einer SQL Tabelle anzeigen. Mit Klick auf den Spaltennamen sortieren ich die Daten nach dem angeklickten Spaltennamen neu. Nach dem sortieren steht der Cursor allerdings auf dem ersten Feld in Spalte 1.Eibt es eine Möglichkeit heraus zu finden, an welcher Position ich mich mit dem Cursor in dem DBGrid befand bevor ich neu sortiert haben. Und wie ich dann nach dem sortieren wieder an die vorherige Position "springe"?
Danke im voraus.
-
du kannst mit
int q = DBGrid1->DataSource->DataSet->FieldByName("DeineIDSpalte")->AsInteger;
die Datensatz-ID speichern, die gerade aktiv ist und dann - nach dem Sortieren - mit Locate den Datensatz suchen und wieder zum aktiven machen
-
Danke für den Tipp. Wenn ich das richtig sehe, muss ich dabei die Spalte selber angeben oder? Ich habe aber ca. 50 Spalten und sortiere nicht immer nach der gleichen. Wie mache ich das dann?
-
Dann merke dir den Spaltennamen in einer Variablen...
-
Sorry. Da habe ich was verplant. Den Spaltennamen habe ich ja durch das klicken auf die Spalte.
Jetzt habe ich allerdings noch ein kleines Problem mit Locate. Folgendes habe ich jetzt
DBAktuelleDB->DataSource->DataSet->Locate(SortierOption, ,loCaseInsensitive);
SortierOptioin ist der Spaltenname. Aber was muss ich als zweite Option bei Locate mit angeben? Werde aus der Hilfe nicht schlau.
-
in meiner BCB6/BCB2009-Hilfe steht z.B.:
TLocateOptions Opts; Opts.Clear(); Opts << loPartialKey; Variant locvalues[2]; locvalues[0] = Variant("Sight Diver"); locvalues[1] = Variant("P"); CustTable->Locate("Company;Contact", VarArrayOf(locvalues, 1), Opts);
d.h. für deinen Fall:
TLocateOptions Opts; Opts.Clear(); Opts << loCaseInsensitive; Variant locvalues = Variant(Deine_Variable); DBAktuelleDB->DataSource->DataSet->Locate(SortierOption,VarArrayOf(locvalues, 0),Opts);
Allerdings solltest du bei deiner Variante etwas bedenken: was passiert wenn in einer Spalte der Wert mehrmals auftritt? dann wird der zuerst vorkommende Wert aktiviert und damit nicht umbedingt der den du wolltest. Deshalb hatte ich die ID-Spalte ("DeineIDSpalte") angegeben, da die in einer Tabelle eigentlich immer eineindeutige Werte liefern sollte. Und damit brauchst du auch den Spaltennamen nicht, da du immer nur über die ID-Spalte suchst.
-
Ok. In dem Fall wäre die ID wohl sinnvoller. Sucht Locate denn in den Daten nach dem Wert den ich angegeben habe? Locate sucht dann also nicht nach dem Spaltennamen?
Ist das dann bei der ID anders? Und kann ich die ID auch mit Locate bestimmen?
EDIT
Wenn ich dein Beispiel einfüge bekomme ich folgende Fehlermeldung:[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(181): E2034 Konvertierung von 'Variant' nach 'const Variant ' nicht möglich
[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(181): E2342 Keine Übereinstimmung des Typs beim Parameter 'Values' ('const Variant ' erwartet, 'Variant' erhalten)
[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(346): E2288 Zeiger auf Struktur auf linker Seite von -> oder von -> erforderlichDein Beispiel habe ich nur folgend geändert:
Variant locvalues = Variant(SortierOption);
-
Locate hat als 1. Parameter den Spaltenname in dem er suchen soll, der 2. Parameter ist der Wert nach dem er suchen soll und der 3. Parameter sind die Suchoptionen
versuchs mal so:TLocateOptions Opts; Opts.Clear(); Opts << loCaseInsensitive; Variant locvalues[0] = Variant(Deine_Such_Variable); // <-- hier hab ich jetzt mal nen Feld draus gemacht DBAktuelleDB->DataSource->DataSet->Locate("DeineIDSpalte",VarArrayOf(locvalues, 0),Opts);
-
Dann bekomme ich noch immer diesen Fehler:
[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(181): E2034 Konvertierung von 'Variant' nach 'const Variant ' nicht möglich
[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(181): E2342 Keine Übereinstimmung des Typs beim Parameter 'Values' ('const Variant ' erwartet, 'Variant' erhalten)
[C++ Fehler] bearbeiten_aktuelle_db_cpp.cpp(346): E2288 Zeiger auf Struktur auf linker Seite von -> oder von -> erforderlichWas ist denn, wenn Locate den Wert nach dem er suchen soll nicht findet. Springt er dann trotzdem in die Spalte?
-
Ich habe es jetzt mal so umgebaut.
TLocateOptions Opts; Opts.Clear(); Opts << loCaseInsensitive; Variant locvalues = Variant ("79102"); // <-- hier hab ich jetzt mal nen Feld draus gemacht DBAktuelleDB->DataSource->DataSet->Locate(SortierOption, locvalues ,Opts);
Damit funktioniert es auch... Jetzt fällt mir allerdings auf, dass ich das so überhaupt nicht haben möchte.
Eigentlich will ich folgendes haben... ich habe z. B. 50 Spalten in meiner Tabelle. Jetzt klicke ich auf Spalte 20 und dann wird die Tabelle nach der Spalte 20 sortiert. Das klappt auch, ist schon fertig.
Ich möchte jetzt aber, dass ich nach dem sortieren wieder bei Spalte 20 mit dem "Cursor" stehe. Aktuell wird nach dem sortieren Zeile 1, Spalte 1 markiert.Geht das?
Sorry...