Delphi 刷新DBGrid后选择行

Delphi 刷新DBGrid后选择行,delphi,set,row,selected,dbgrid,Delphi,Set,Row,Selected,Dbgrid,嗯,我问了一些n00b问题。我在网上冲浪过,也问过类似的问题,但对于这样一个简单的问题(如我所想),我还没有找到任何正确的答案 我有一个DBGrid。我选择一行并使用链接到此行的另一个数据执行一些操作。完成后,将刷新DBGrid并将选定行重置为第一行。我希望得到与刷新DBGrid数据之前选择的行相同的行。有什么建议吗?在刷新之前,将链接数据集的当前选择保存为书签,然后恢复书签。此答案是对Mason的补充,而不是替代方案。我之所以添加它,只是因为出现了另一个答案,在我看来,它错误地建议使用数据集的

嗯,我问了一些n00b问题。我在网上冲浪过,也问过类似的问题,但对于这样一个简单的问题(如我所想),我还没有找到任何正确的答案


我有一个DBGrid。我选择一行并使用链接到此行的另一个数据执行一些操作。完成后,将刷新DBGrid并将选定行重置为第一行。我希望得到与刷新DBGrid数据之前选择的行相同的行。有什么建议吗?

在刷新之前,将链接数据集的当前选择保存为书签,然后恢复书签。

此答案是对Mason的补充,而不是替代方案。我之所以添加它,只是因为出现了另一个答案,在我看来,它错误地建议使用数据集的RecNo属性。并非所有TDataSet子体都可靠或完全实现RecNo。某些子代只返回一个常量值,例如当前行的RecNo的0,并且在为其赋值时不执行任何操作

RecKey:=DmFRM.ViewTBL.RecNo;
          with DmFRM.ViewTBL do
               begin
                  Active:=false;
                  Active:=True;
                  RecNo:=RecKey;
               end;
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;

我看到这已经有一个-1,所以我不会添加我的。使用-1的原因可能是并非所有TDataSet子体都有效地实现了RecNo,或者在某些情况下根本没有实现RecNo。因此,对于Op的问题,@MartynA,“GetBookmark依赖受保护的方法来获取书签值。TDataSet子体实现此方法是为了提供自己类型的书签支持。单向数据集不支持书签,因此不会返回有意义的值。”@马哈茂德:我不知道你为什么对我引用这句话。单向数据集可能不支持书签,但这与它们不能直接连接到TDBGrid的原因相同,即网格依赖于数据集在两个方向上都可导航。因此,要将单向数据集用于TDBGrid,您必须将网格连接到TClientDataset并从单向数据集加载该数据集。Boomark的工作原理与RecNo类似?还是不,例如:如果我得到书签,然后删除所选记录之前的一些记录,然后我转到书签,现在所选记录与删除之前的所选记录相同,换句话说:书签存储只是记录的RecNo或Position,或者它存储关于所选记录的另一个信息?我认为这取决于书签在特定的degendanf或TDataset中是如何实现的,但是如果任何一个普通的书签只使用记录编号,我会感到惊讶。从我所研究的少数几个方面来看,它们通常使用包含特定于实现的数据的缓冲区。如果对给定类型的数据集是否实现书签有疑问,请调用BookmarkValid函数(请参阅OLH)。谢谢,我尝试了GetBookmark和GotoBookmark以获取一条已删除的记录:GetBookmark->Delete Selected(Bookmarked)record->GotoBookmark,但出现了一个错误:“record not found”,我有一个表,应该刷新每一秒,我想让用户滚动,在这种情况下,我认为我应该使用RecNo,我尝试了RecNo和工作良好