TDBGrid.SelectedRows 什么时候在 Delphi 中更新?

When is TDBGrid.SelectedRows updated in Delphi?

我想在 TEdit 控件中列出 TDBGrid 的选定行的一些值(在本例中为 ID-s) .

我试过 AfterScroll 事件,在(!)选择之后捕捉事件,但如果我使用鼠标,它不起作用。

如果我用鼠标单击一行,它不会出现在 TDBGrid.SelectedRows 集合中,只会出现在下一个 click/selection 之后。 如果我用键盘进行选择,一切正常。

你有什么想法,如何解决这个问题?

我的解决方案的简化代码:

procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet);
begin
    edtIDs.Text := string.Join(',', GetSelectedIDs().ToArray) ;
end;

function TForm1.GetSelectedIDs() : TList<string>;
var
    i: Integer;
    ds: TDataSet;
    bmOrig: TBookmark;
begin
    FSelectedIDs.Clear();
    ds := DBGrid1.DataSource.DataSet;
    bmOrig := ds.GetBookmark();
    ds.AfterScroll := nil;                          //switch off AfterScroll event
    try
        if DBGrid1.SelectedRows.Count > 0 then begin
            for i := 0 to DBGrid1.SelectedRows.Count - 1 do begin
                ds.GotoBookmark(DBGrid1.SelectedRows.Items[i]);
                FSelectedIDs.Add(ds.FindField('ID').AsString);
            end;
            ds.GotoBookmark(bmOrig);
        end;
    finally
        ds.AfterScroll := ClientDataSet1AfterScroll; //switch on AfterScroll event
        ds.FreeBookmark(bmOrig);
    end;
    Result := FSelectedIDs;
end;

将数据源的OnAfterScroll事件替换为TDBGrid的OnColEnter事件。

表格的帮助 TDBGrid.OnColEnter:

当焦点移动到网格中的新单元格时发生。

编写一个 OnColEnter 事件处理程序,以便在刚刚选择 新单元格时采取特定操作。

时焦点移动到一个单元格
  • 用户使用键盘导航到单元格。例如,当用户使用 Tab 键或 Home 键时。
  • 用户在单元格中单击鼠标按钮。
  • 已设置 SelectedField 或 SelectedIndex 属性。

读取 SelectedField 或 SelectedIndex 属性 以确定刚刚输入的单元格。