好吧,来自我的某种n00b问题。我在这里上网和类似的问题,但没有找到任何正确的答案这样简单(我想)的问题。刷新DBGrid后选择行
我有一个DBGrid。我选择一行并使用链接到此行的另一个数据进行一些操作。完成后,我的DBGrid正在刷新,选定的行重置为第一个。我想要获取在刷新DBGrid数据之前选择的同一行。有什么建议么?
好吧,来自我的某种n00b问题。我在这里上网和类似的问题,但没有找到任何正确的答案这样简单(我想)的问题。刷新DBGrid后选择行
我有一个DBGrid。我选择一行并使用链接到此行的另一个数据进行一些操作。完成后,我的DBGrid正在刷新,选定的行重置为第一个。我想要获取在刷新DBGrid数据之前选择的同一行。有什么建议么?
刷新之前,将链接数据集的当前选择保存为书签,然后恢复书签。
RecKey:=DmFRM.ViewTBL.RecNo;
with DmFRM.ViewTBL do
begin
Active:=false;
Active:=True;
RecNo:=RecKey;
end;
我看到这已经有一个-1,所以我不会加我的。 -1的原因可能并非所有的TDataSet后代都有用地或在某些情况下实现RecNo。因此,作为Op的问题的一般答案,恐怕没有用处, – MartynA 2014-07-27 09:05:57
@MartynA:“GetBookmark依靠受保护的方法来获取书签值.TDataSet后代实现此方法来提供它们自己的书签支持类型。单向数据集不支持书签,因此不会返回有意义的值。“ – 2015-10-02 15:20:24
@Mahmood_M:我不确定你为什么要引用我。单向数据集可能不支持书签,但出于同样的原因,它们不能直接连接到TDBGrid,即网格依赖于可在两个方向上导航的数据集。因此,要将单向数据集用于TDBGrid,必须将网格连接到TClientDataset并从单向数据集加载。 – MartynA 2015-10-02 16:15:14
这个答案的目的是为梅森的一个小补充,而不是替代。我已经添加了它,只是因为出现了另一个答案,提示使用数据集的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;
Boomark像RecNo一样工作?或不 ? ,例如:如果我收到书签,然后删除选定记录之前的一些记录,然后我去书签,现在选定的记录与删除前选择的记录相同? ,换句话说:Bookmark store只是RecNo或记录的位置,或者它存储关于选定记录的另一个信息? – 2015-10-02 15:16:22
我认为这取决于如何在特定的descendanf或TDataset中实现书签,但如果任何一个常用的仅使用记录编号,我会感到惊讶。从我研究过的少数几个人中,他们通常使用包含实现特定数据的缓冲区。如果怀疑给定类型的数据集是否实现书签,请调用BookmarkValid函数(请参阅OLH)。 – MartynA 2015-10-03 09:05:32
谢谢,我试图GetBookmark和GotoBookmark删除记录:GetBookmark - >删除选中(书签)记录 - > GotoBookmark,我得到一个错误:“记录未找到”,我有一个表应刷新每秒,我想为了让用户滚动,在这种情况下,我认为我应该使用RecNo,我试过RecNo并且工作正常 – 2015-10-04 09:48:46
是的,它似乎有效。谢谢! – Vlad 2009-10-25 12:27:24
你能给我们一个示例代码吗? – truthseeker 2012-01-24 13:39:23