2009-10-25 121 views
5

好吧,來自我的某種n00b問題。我在這裏上網和類似的問題,但沒有找到任何正確的答案這樣簡單(我想)的問題。刷新DBGrid後選擇行

我有一個DBGrid。我選擇一行並使用鏈接到此行的另一個數據進行一些操作。完成後,我的DBGrid正在刷新,選定的行重置爲第一個。我想要獲取在刷新DBGrid數據之前選擇的同一行。有什麼建議麼?

回答

4

刷新之前,將鏈接數據集的當前選擇保存爲書籤,然後恢復書籤。

+0

是的,它似乎有效。謝謝! – Vlad 2009-10-25 12:27:24

+1

你能給我們一個示例代碼嗎? – truthseeker 2012-01-24 13:39:23

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

我看到這已經有一個-1,所以我不會加我的。 -1的原因可能並非所有的TDataSet後代都有用地或在某些情況下實現RecNo。因此,作爲Op的問題的一般答案,恐怕沒有用處, – MartynA 2014-07-27 09:05:57

+0

@MartynA:「GetBookmark依靠受保護的方法來獲取書籤值.TDataSet後代實現此方法來提供它們自己的書籤支持類型。單向數據集不支持書籤,因此不會返回有意義的值。「 – 2015-10-02 15:20:24

+0

@Mahmood_M:我不確定你爲什麼要引用我。單向數據集可能不支持書籤,但出於同樣的原因,它們不能直接連接到TDBGrid,即網格依賴於可在兩個方向上導航的數據集。因此,要將單向數據集用於TDBGrid,必須將網格連接到TClientDataset並從單向數據集加載。 – MartynA 2015-10-02 16:15:14

4

這個答案的目的是爲梅森的一個小補充,而不是替代。我已經添加了它,只是因爲出現了另一個答案,提示使用數據集的RecNo屬性不正確。並非所有的TDataSet後代都能可靠地執行RecNo或完全執行。一些後代只返回一個固定值,例如對於當前行的RecNo爲0,並且在爲其分配值時不執行任何操作。

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像RecNo一樣工作?或不 ? ,例如:如果我收到書籤,然後刪除選定記錄之前的一些記錄,然後我去書籤,現在選定的記錄與刪除前選擇的記錄相同? ,換句話說:Bookmark store只是RecNo或記錄的位置,或者它存儲關於選定記錄的另一個信息? – 2015-10-02 15:16:22

+0

我認爲這取決於如何在特定的descendanf或TDataset中實現書籤,但如果任何一個常用的僅使用記錄編號,我會感到驚訝。從我研究過的少數幾個人中,他們通常使用包含實現特定數據的緩衝區。如果懷疑給定類型的數據集是否實現書籤,請調用BookmarkValid函數(請參閱OLH)。 – MartynA 2015-10-03 09:05:32

+0

謝謝,我試圖GetBookmark和GotoBookmark刪除記錄:GetBookmark - >刪除選中(書籤)記錄 - > GotoBookmark,我得到一個錯誤:「記錄未找到」,我有一個表應刷新每秒,我想爲了讓用戶滾動,在這種情況下,我認爲我應該使用RecNo,我試過RecNo並且工作正常 – 2015-10-04 09:48:46