每次更改TDbGrid选定位置时会触发什么事件?

时间:2008-11-17 02:21:05

标签: delphi datagrid event-handling

我的项目中有一个TDbGrid,每次更改所选行时我都会尝试关闭事件。行中的任何更改都已更新链接到同一DataSource的所有数据感知控件,但还有其他更改,我需要一个事件处理程序。

我认为OnColEnter会起作用。根据帮助文件,它会在以下情况下触发:

  • 用户使用导航到单元格 键盘。例如,当 用户使用Tab键或Home 键。

  • 用户单击鼠标按钮 在牢房里。

  • SelectedField或SelectedIndex 财产设定。

不幸的是,当用户在启用dgRowSelect选项的情况下使用键盘导航时,会触发,并且没有OnRowEnter。并且在进行选择更改之前会触发OnKeyDown事件。我试图在这里模拟TListBox的数据感知版本,我需要一些东西来替换List Box的OnClick处理程序,尽管名称实际上随着选择的改变而消失,无论是通过鼠标还是键盘。有没有办法用TDbGrid做到这一点?如果没有,那么必须有一些其他网格控制来完成它。有谁知道它是什么? (最好是开源?)

4 个答案:

答案 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;