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 属性 以确定刚刚输入的单元格。
我想在 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 属性 以确定刚刚输入的单元格。