2009-10-25 84 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