返回到以前的位置时如何避免TDbgrid滚动

时间:2011-12-22 03:53:55

标签: 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;

3 个答案:

答案 0 :(得分:1)

无法保证网格中的当前记录完全位于可见行的中心,但是当它滚动到视线外时执行定位将使它(新的当前记录)成为可见行的中间行。网格,因此显而易见的滚动 如果要按原样重新定位网格,则必须记住哪一条记录位于顶行。

答案 1 :(得分:1)

在循环遍历数据集之前,您可以记下网格显示的顶行以及显示的总记录数。使用此信息,在重新定位记录后,您可以将记录定位到确切的行,方法是将其移至顶部或底部,然后再移回。

您可以按MoveBy执行移动。不幸的是,Row的{​​{1}}和RowCount属性受到保护,因为您必须使用众所周知的“受保护的黑客”。

this答案中的代码示例以及检查书签,以便您不会以错误的记录结束。

答案 2 :(得分:0)

如果您使用的是TClientDataset,则不必弄乱用户的光标,您可以克隆它并在那里进行编辑。

如果我将DBGrid1链接到ClientDataSet1,并且我将光标放在DBGrid(和ClientDataSet)的第5行并且在第一行的视图中,并使用如下所示的克隆光标删除第一行,我' d看到第一行消失,我选择的行将增加一行高度。

Function TForm.DeleteFirstRow;
var
  myCDS: TClientDataSet;
begin
  myCDS := myCDS.Create(nil);
  try
    myCDS.CloneCursor(ClientDataSet1, False);
    myCDS.First;
    myCDS.Delete;
  finally
    myCDS.Free;
  end;

如果我一直向下滚动到500行左右,在第一行的视图之外,再次执行它,所选行将不会在网格中完全移动。