D6教授.
以前我们使用DBISAM和DBISAMTable.处理RecNo,它可以很好地修改(删除,编辑等).
现在我们替换为不处理RecNo的ElevateDB,很多时候我们使用Queries,而不是Tables.
查询必须重新打开以查看修改.
但是如果我们重新打开查询,我们需要重新定位到最后一条记录.定位是不够的,因为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;
Run Code Online (Sandbox Code Playgroud)
最初的例子是使用moveby.这与Queries工作得很好,因为我们无法看到Query在后台重新打开,可视控件没有改变行位置.
但是当我们有EDBTable或Live/Sensitive Query时,MoveBy使用起来很危险,因为如果有人删除或追加新行,我们可以重新定位到错误的记录中.
然后我尝试使用BookMark(见注释).但是这种技术不起作用,因为它在另一个Row位置显示记录......
所以问题是:如何在DBGrid中强制行位置和记录?
或者,在基础DataSet刷新后,哪种DBGrid可以重定位到记录/行?
我搜索用户友好的解决方案,我理解他们,因为我试图使用这个跳过DBGrid,并且使用非常糟糕,因为我的眼睛在更新后试图找到原始记录时出现... :-(
感谢您的每一个帮助,链接,信息:dd
在下面的代码中,我们对某些选定的行进行一些操作(不是删除)。
然而,有时,完成后,顶部选定的行会滚动,使其显示在网格下方 1/2 处。有没有办法避免这种滚动?(如果我的遍历下面选定行的代码由于某些不相关的原因不正确,我欢迎更正。)
Function TForm.DoSomethingToSelectedRows;
var
KeyAtStart: Integer;
begin
Result := TRUE;
KeyAtStart := DataSet.FieldByName('Key').AsInteger;
DataSet.DisableControls;
DataSet.First;
try
while Result AND (NOT DataSet.EOF) do DataSet
begin
if DBGrid1.SelectedRows.CurrentRowSelected then
Result := ... do something ...
fMPODataTls.GetDS.Next;
end;
finally
DataSet.Locate('Key', KeyAtStart, []); // re-position where we started
DataSet.EnableControls;
end;
end;
Run Code Online (Sandbox Code Playgroud)