1

我需要知道当数据集调用enablecontrols时 TDBGrid 中会发生什么。我知道数据集正在通知数据源,但我不知道在OnDrawCell事件之前在 dbgrid 组件上调用了什么。

从 db.pas 数据集正在调用

  if (FDisableState <> dsInactive) and (FState <> dsInactive) then
    DataEvent(FEnableEvent, 0);

数据源如何通知 dbgrid 它需要显示多少列?

4

1 回答 1

4

数据源通过数据链接 ( TDataLink) 链接到数据感知控件。每个数据控件都会创建一个DataLink以响应和发送附加信号DataSource

a 的 DataLink是在 中创建DBGrid的类型。TGridDataLinkTCustomDBGrid.CreateDataLink

这是之后的调用堆栈TDataSet.EnableControls

  • TDataSet.EnableControls来电TDataSet.DataEvent
  • TDataSet.DataEvent调用FDataSources[I]).DataEvent所有附加的数据源,
  • TDataSource.DataEvent调用TDataSource.NotifyDataLinks,调用TDataSource.NotifyLinkTypes
  • TDataSource.NotifyLinkTypes调用FDataLinks[I]).DataEvent所有附加的数据链接,
  • TDataLink.DataEvent调用TGridDataLink.DataSetChangedTGridDataLink.LayoutChanged,取决于之前发生的事情EnableControls被调用。对记录的编辑是数据集的更改;添加字段(网格中的列)是布局更改(除其他外),
  • TGridDataLink呼叫FGrid.DataChangedFGrid.LayoutChanged,
  • TCustomDBGrid.LayoutChanged最终调用TCustomDBGrid.BeginLayout
  • TCustomDBGrid.BeginLayout将列(计数、标题等)的更新委托给Columns属性并调用Columns.BeginUpdate.

OnDrawCell发生在未来某个时间,当所有布局更改完成时。

于 2013-03-30T14:18:17.637 回答