【发布时间】:2011-03-01 01:18:04
【问题描述】:
D6 教授
以前我们使用 DBISAM 和 DBISAMTable。它处理 RecNo,并且可以很好地进行修改(删除、编辑等)。
现在我们替换为不处理 RecNo 的 ElevateDB,而且很多时候我们使用查询,而不是表。
查询必须重新打开才能看到修改。
但是如果我们重新打开查询,我们需要重新定位到最后一条记录。 定位是不够的,因为 Grid 在另一行中显示它。 这是一件很烦人的事,因为修改记录移到另一行后,你很难跟上,用户讨厌这个。
我们找到了这段代码:
function TBaseDBGrid.GetActRow: integer;
begin
Result := -1 + Row;
end;
procedure TBasepDBGrid.SetActRow(aRow: integer);
var
bm : TBookMark;
begin
if IsDataSourceValid(DataSource) then with DataSource.DataSet do begin
bm := GetBookmark;
DisableControls;
try
MoveBy(-aRow);
MoveBy(aRow);
//GotoBookmark(bm);
finally
FreebookMark(bm);
EnableControls;
end;
end;
end;
最初的例子是使用 moveby。这适用于查询,因为我们看不到查询在后台重新打开,因此视觉控件不会更改行位置。
但是当我们有 EDBTable 或 Live/Sensitive Query 时,使用 MoveBy 很危险,因为如果有人删除或追加新行,我们可能会重新定位到错误的记录中。
然后我尝试使用书签(见备注)。但是这种技术不起作用,因为它是在另一个 Row 位置显示记录...
那么问题来了:如何在 DBGrid 中强制行位置和记录?
或者在底层DataSet刷新后,什么样的DBGrid可以重定位到记录/行?
我在寻找用户友好的解决方案,我理解他们,因为我尝试使用这种跨 DBGrid 的跳转,并且使用起来非常糟糕,因为更新后尝试查找原始记录时我的眼睛都出来了......: -(
感谢您的每一个帮助、链接、信息: dd
【问题讨论】:
标签: delphi dataset row dbgrid locate