何时在Delphi中更新TDBGrid.SelectedRows?

何时在Delphi中更新TDBGrid.SelectedRows?,delphi,tdbgrid,Delphi,Tdbgrid,我想在TEdit控件中TDBGrid的选定行中列出一些ID-s值 我已经试过了“余弦”事件,想抓住“余弦”事件!一个选择,但如果我使用鼠标,它不起作用 如果我用鼠标单击一行,它不会出现在TDBGrid.SelectedRows集合中,只有在下一次单击/选择之后。 如果我用键盘做选择,一切都很好 你知道怎么解决这个问题吗 我的解决方案的简化代码: procedure TForm1.ClientDataSet1AfterScroll(DataSet: TDataSet); begin edt

我想在TEdit控件中TDBGrid的选定行中列出一些ID-s值

我已经试过了“余弦”事件,想抓住“余弦”事件!一个选择,但如果我使用鼠标,它不起作用

如果我用鼠标单击一行,它不会出现在TDBGrid.SelectedRows集合中,只有在下一次单击/选择之后。 如果我用键盘做选择,一切都很好

你知道怎么解决这个问题吗

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

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的OnColonter事件

请在TDBGrid.onclenter的帮助下:

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

编写一个onclenter事件处理程序,以便在刚刚选择新单元格时执行特定操作

当焦点移动到单元格时

用户使用键盘导航到单元格。例如,当用户使用Tab键或Home键时。 用户在单元格中向下单击鼠标按钮。 已设置SelectedField或SelectedIndex属性。
读取SelectedField或SelectedIndex属性以确定刚刚输入的单元格

这种构建选定行列表的方法似乎效率低下,这是可以避免的,因为您可以在数据集滚动时访问每个选定行。顺便说一句,您应该通过调用ds.DisableControls和ds.EnableControls来包围for循环,以避免不必要的屏幕更新。