我的项目中有一个TDbGrid,每次更改所选行时我都会尝试关闭事件。行中的任何更改都已更新链接到同一DataSource的所有数据感知控件,但还有其他更改,我需要一个事件处理程序。
我认为OnColEnter会起作用。根据帮助文件,它会在以下情况下触发:
用户使用导航到单元格 键盘。例如,当 用户使用Tab键或Home 键。
用户单击鼠标按钮 在牢房里。
SelectedField或SelectedIndex 财产设定。
不幸的是,当用户在启用dgRowSelect选项的情况下使用键盘导航时,不会触发,并且没有OnRowEnter。并且在进行选择更改之前会触发OnKeyDown事件。我试图在这里模拟TListBox的数据感知版本,我需要一些东西来替换List Box的OnClick处理程序,尽管名称实际上随着选择的改变而消失,无论是通过鼠标还是键盘。有没有办法用TDbGrid做到这一点?如果没有,那么必须有一些其他网格控制来完成它。有谁知道它是什么? (最好是开源?)
答案 0 :(得分:8)
您是否尝试过DataSource的OnDataChange事件?
答案 1 :(得分:3)
OnDataChange是一种选择。另一个是,在TDataset方面,事件AfterScroll。大多数时候,我发现它比OnDataChange更实用;因为在OnDataChange中,滚动事件带有Field参数nil(这是一个陷阱,可能是AV编码的原因之一)。
答案 2 :(得分:2)
使用OnDataChange并处理加载数据集的情况,添加布尔检查作为例程的第一行,并在加载完成时将其设置为false。
procedure TForm1.DataSource1DataChange(Sender: TObject; Field: TField);
begin
if fbLoading then exit;
// rest of your code here
end;
procedure TForm1.Form1Create(Sender:tObject);
begin
fbLoading := true;
// load your table here
fbLoading := false;
end;
答案 3 :(得分:1)
我只会在数据集上使用AfterScroll,它会在您第一次打开数据集时触发,并且每次移动时都会触发。在DBGrid中,可以是行上的每次单击,或滚动条,或使用键盘(Home,Edn,Up,Down,PgUp,PgDown)等。
如果您使用多种不同形式的相同数据集(在创建/自由或显示/关闭中),您甚至可以动态分配它:
procedure TForm1.myAfterScroll(DataSet: TDataSet);
begin
//do your thing here
if oldAfterScroll<>nil then
oldAfterScroll(DataSet);
end;
constructor TForm1.Create(AOwner: TComponent);
begin
oldAfterScroll:=DBGrid1.DataSet.OnAfterScroll;
DBGrid1.DataSet.OnAfterScroll:=myAdrerScroll;
end;
destructor TForm1.Free;
begin
DBGrid1.DataSet.OnAfterScroll:=oldAfterScroll;
end;