Delphi - 在dataset.enablecontrols上的TDBGrid内触发了什么事件

时间:2013-03-30 10:52:27

标签: delphi delphi-xe

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

来自db.pas的

数据集正在调用

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

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

1 个答案:

答案 0 :(得分:4)

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

DBGrid的DataLink属于TGridDataLink类型TCustomDBGrid.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将在以后的某个时间进行,届时将进行所有布局更改。