2015-04-28 6 views
5

Ich verstehe, dass das Ausführen einer Abfrage aktualisiert.Refresh Query/cxGrid ohne verlorenen ausgewählten Datensatz

query.Close; 
query.Open; 

Aber nachdem Sie dies getan haben, wird der Fokus wieder auf den allerersten Datensatz auf dem cxGrid gesetzt.

Gibt es eine Möglichkeit, dass der aktuelle Datensatz nach dem Aktualisieren der Abfrage ausgewählt bleibt?

Danke.

Ich habe folgendes getan ..

procedure Tdatamodule.RefreshGrid; 
var pos : tbookmark; 
begin 
pos := qryMainGrid.GetBookmark; 
try 
    qryMainGrid.Close; 
    qryMainGrid.Open; 
    qryMainGrid.GotoBookmark(pos); 
finally 
    qryMainGrid.FreeBookmark(pos); 
end; 

Ende;

Jetzt aber Fehlermeldung Lesezeichen für Dataset nicht gefunden.

Alle Vorschläge würden sehr geschätzt werden.

+0

Abhängig vom Typ Ihrer Abfragekomponente können Sie 'if qryMainGrid.BookmarkValid (pos) then 'vor dem Aufruf von' GotoBookmark' hinzufügen, um diesen Fehler zu stoppen. –

+0

Ich benutze TADquery, die eine FireDAC-Komponente ist, habe ich versucht, BookmarkValidate (pos) vor GoToBookmark, aber ich bekomme immer noch den gleichen Fehler, Danke – Sharpie

Antwort

4

Um das Dataset zu aktualisieren, rufen Sie die Methode Refresh auf und verwenden Sie das Lesezeichen, um die Cursorposition des Datasets zu speichern. Sie fragen für das Lesezeichen an der aktuellen Cursorposition durch GetBookmark Aufruf, aktualisieren Sie die Datenmenge und auf die markierten Position bewegen, indem GotoBookmark Aufruf:

var 
    Bookmark: TBookmark; 
begin 
    Bookmark := Query.GetBookmark; 
    Query.Refresh; 
    Query.GotoBookmark(Bookmark); 
end; 

Sie brauchen nicht FreeBookmark rufen Sie das Lesezeichen in Ihrem Delphi zu befreien Version, weil der Typ TBookmark ein dynamisches Array wurde und als solcher vom Compiler verwaltet wird, wenn er den Gültigkeitsbereich der Funktion verlässt.

+0

Ich habe meine ursprüngliche Frage bearbeiten mit was ich getan habe und was jetzt passiert, danke – Sharpie

+0

@TLama, die Dinge besser machen, danke, aber wenn ich mein Formular mit dem cxGrid darauf öffne, zeigt es ganz unten im Raster an, ich habe viele Datensätze in diesem Raster, gibt es eine Möglichkeit, Raster zu zeigen ganz oben beim Öffnen der Form? Danke, – Sharpie

+1

@TLama; Ich denke, einige Dinge sind richtig in der Frage, andere könnten in einem anderen Kommentar hinzugefügt werden. Wie auch immer, das Ergebnis ist gut, wir lassen es einfach. [Ich werde diesen Kommentar später auch löschen]. Vielen Dank. –