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