Sélectionner une ligne après l'actualisation de DBGrid
Question
Eh bien, une sorte de question n00b de ma part. J'ai surfé sur le net et des questions similaires ici, mais je n'ai trouvé aucune bonne réponse à un problème aussi simple (comme je le pensais).
J'ai un DBGrid. Je sélectionne une ligne et effectue des actions avec une autre donnée liée à cette ligne. Une fois que j'ai terminé, mon DBGrid en cours d'actualisation et la ligne sélectionnée sont réinitialisées en premier. Je souhaite que la même ligne soit sélectionnée avant l'actualisation des données DBGrid. Des suggestions?
La solution
Avant d'actualiser, enregistrez la sélection actuelle du jeu de données lié en tant que signet, puis restaurez le signet par la suite.
Autres conseils
Cette réponse est conçue comme un complément mineur à Mason, et non comme une alternative. Je ne l'ai ajouté que parce qu'une autre réponse est apparue, suggérant, à tort, l'utilisation de la propriété RecNo de l'ensemble de données. Tous les descendants de TDataSet n'implémentent pas RecNo de manière fiable ou pas du tout. Certains descendants renvoient simplement une valeur constante, par exemple. 0 pour la valeur RecNo des lignes actuelles et ne faites rien lorsque vous lui affectez une valeur.
procedure TMyForm.DoSomethingWithDataSet(ADataSet : TDataSet);
var
Bookmark : TBookmark;
begin
Bookmark := ADataSet.GetBookmark; // Save your place in ADataSet
try
Screen.Cursor := crSqlWait; // Show the user that something is happening
Update; // update the form to make sure screen cursor updates
ADataSet.DisableControls;
// do something with ADataSet here e.g.
ADataSet.First;
while not ADataSet.Eof do begin
// do something with current row here, then
ADataSet.Next;
end;
finally
ADataSet.GotoBookmark(Bookmark); // Return to where you were at outset
ADataSet.FreeBookmark(Bookmark);
ADataSet.EnableControls;
Screen.Cursor := crDefault; // Let the user see you're done
end;
end;
RecKey:=DmFRM.ViewTBL.RecNo;
with DmFRM.ViewTBL do
begin
Active:=false;
Active:=True;
RecNo:=RecKey;
end;