在下面的代码中,我们对某些选定的行进行了一些操作(而不是删除)。
但是,有时,完成后,顶部选定的行已滚动,以便在网格下方显示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;
答案 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行左右,在第一行的视图之外,再次执行它,所选行将不会在网格中完全移动。