2009-10-25 21 views
5

Cóż, jakieś pytanie n00b ode mnie. Przeszukałem sieć i podobne pytania, ale nie znalazłem żadnych właściwych odpowiedzi na tak prosty (jak mi się wydawało) problem.Wybierz wiersz po odświeżeniu DBGrid

Mam DBGrid. Wybieram jeden wiersz i podejmuję pewne działania z innymi danymi powiązanymi z tym wierszem. Po zakończeniu mój DBGrid jest odświeżany, a wybrany wiersz resetowany do pierwszego. Chcę uzyskać ten sam wybrany wiersz, który został wybrany przed odświeżeniem danych DBGrid. Jakieś sugestie?

Odpowiedz

4

Przed odświeżeniem zapisz bieżący wybór połączonego zestawu danych jako zakładkę, a następnie przywróć zakładkę.

+0

Tak, wygląda na to, że działa. Dziękuję Ci! – Vlad

+1

Czy możesz podać nam przykładowy kod? – truthseeker

-1
RecKey:=DmFRM.ViewTBL.RecNo; 
      with DmFRM.ViewTBL do 
       begin 
        Active:=false; 
        Active:=True; 
        RecNo:=RecKey; 
       end; 
+0

Widzę, że to już ma wartość -1, więc nie dodam mojej. Przyczyną -1 jest prawdopodobnie to, że nie wszyscy potomkowie TDataSet implementują RecNo w użyteczny sposób lub w niektórych przypadkach w ogóle. Tak więc, nie jest użyteczna jako ogólna odpowiedź na pytanie OP, obawiam się, – MartynA

+0

@MartynA: "GetBookmark opiera się na zabezpieczonej metodzie, aby uzyskać wartość zakładki." Potomkowie TDataSet implementują tę metodę, aby zapewnić własny typ obsługi zakładek Jednokierunkowe zbiory danych nie obsługują zakładek, więc nie zwracają znaczącej wartości. " –

+0

@Mahmood_M: Nie jestem pewien, czemu cytujesz mi to. Jednokierunkowe zestawy danych mogą nie obsługiwać zakładek, ale z tego samego powodu nie mogą być bezpośrednio podłączone do TDBGrid, a mianowicie, że sieć opiera się na tym, że zbiór danych można nawigować w obu kierunkach. Tak więc, aby użyć jednokierunkowego zestawu danych do TDBGrid, należy podłączyć siatkę do TClientDataset i załadować ją z jednokierunkowej. – MartynA

4

Ta odpowiedź jest przeznaczona jako pomniejsze uzupełnienie dla Masona, a nie jako alternatywa. Dodałem go tylko dlatego, że pojawiła się inna odpowiedź, sugerując, niewłaściwie imo, użycie właściwości RecNo zbioru danych. Nie wszyscy potomkowie TDataSet implementują RecNo niezawodnie lub wcale. Niektórzy potomkowie po prostu zwracają stałą wartość, np. 0 dla RecNo bieżących wierszy i nic nie robić po przypisaniu do niego wartości.

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; 
+0

Boomark działa jak RecNo? albo nie ? na przykład: jeśli dostanę zakładkę, a następnie usunę niektóre rekordy przed wybranym rekordem, a następnie przejdę do zakładki, teraz wybrany rekord jest taki sam, jak zaznaczony przed usunięciem? , innymi słowy: Zakładka sklepu po prostu RecNo lub Pozycja rekordu lub przechowuje inne informacje o wybranym rekordzie? –

+0

Myślę, że to zależy od tego, jak zakładki są zaimplementowane w konkretnym descendanf lub TDataset, ale zdziwiłbym się, gdyby któryś z nich zwykły używał tylko numeru rekordu. Od nielicznych, których szukałem, zwykle używają bufora, który zawiera dane specyficzne dla implementacji. W razie wątpliwości, czy dany typ zbioru danych implementuje zakładki, wywołaj funkcję BookmarkValid (patrz OLH). – MartynA

+0

dziękuję, próbowałem GetBookmark i GotoBookmark dla usuniętego rekordu: GetBookmark -> Usuń wybrane (zaznaczone do zakładek) Nagrywanie -> GotoBookmark i dostałem błąd: "Record not found", mam tabelę, która powinna odświeżać się co sekundę i chcę aby utrzymać użytkowników przewijanie, w tej sytuacji myślę, że powinienem użyć RecNo, próbowałem RecNo i działa dobrze –

Powiązane problemy