返回先前位置时如何避免 TDbgrid 滚动

Rob*_*ank 5 delphi

在下面的代码中,我们对某些选定的行进行一些操作(不是删除)。

然而,有时,完成后,顶部选定的行会滚动,使其显示在网格下方 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)

Ser*_*yuz 2

在循环访问数据集之前,您可以记下网格显示的顶行以及显示的总记录数。利用此信息,在重新定位记录后,您可以通过移动到顶部或底部然后再次移回来将记录定位到确切的行。

您可以通过 s 进行移动MoveBy。不幸的是, 的RowRowCount属性TDBGrid受到保护,因此您必须使用众所周知的“受保护的黑客”。

这个答案中有代码示例,以及检查书签,这样您就不会得到错误的记录。