D6 prof.
以前我们使用DBISAM 和DBISAMTable。它处理 RecNo,并且可以很好地进行修改(删除、编辑等)。
现在我们用 ElevateDB 替换,它不处理 RecNo,而且很多时候我们使用查询,而不是表。
必须重新打开查询才能看到修改。
但是如果我们重新打开查询,我们需要重新定位到最后一条记录。
定位是不够的,因为网格将其显示在另一行中。
这是非常令人不安的事情,因为修改记录移动到另一行后,你很难跟踪它,而用户讨厌这一点。
我们找到了这段代码:
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 或实时/敏感查询时,使用 MoveBy 是危险的,因为如果有人删除或追加新行,我们可能会重新定位到错误的记录。
然后我尝试使用书签(见备注)。但这种技术不起作用,因为它在另一个行位置显示记录......
那么问题来了:如何强制DBGrid中的行位置和记录?
或者什么样的DBGrid可以在底层DataSet刷新后重新定位到记录/行?
我寻找用户友好的解决方案,我理解它们,因为我尝试使用这种跨 DBGrid 的跳转,但使用起来非常糟糕,因为当我尝试在更新后查找原始记录时,我的眼睛都快要出来了...:-(
感谢您的每一个帮助、链接、信息:
DD