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