4

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

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

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

  • 用户在单元格中单击鼠标按钮。

  • SelectedField 或 SelectedIndex 属性已设置。

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

4

4 回答 4

8

您是否尝试过 DataSource 的 OnDataChange 事件?

于 2008-11-17T05:21:42.607 回答
3

OnDataChange 是一种选择。另一个是,在 TDataset 方面,事件 AfterScroll。大多数时候,我发现它比 OnDataChange 更实用;因为在 OnDataChange 中,滚动事件带有 Field 参数 nil(这是一个陷阱,可能是您的 AV 对其进行编码的原因之一)。

于 2008-11-17T15:47:15.557 回答
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;
于 2008-11-17T14:48:51.900 回答
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;
于 2008-11-17T18:36:29.990 回答