我需要知道当数据集调用enablecontrols时 TDBGrid 中会发生什么。我知道数据集正在通知数据源,但我不知道在OnDrawCell事件之前在 dbgrid 组件上调用了什么。
从 db.pas 数据集正在调用
if (FDisableState <> dsInactive) and (FState <> dsInactive) then
DataEvent(FEnableEvent, 0);
数据源如何通知 dbgrid 它需要显示多少列?
我需要知道当数据集调用enablecontrols时 TDBGrid 中会发生什么。我知道数据集正在通知数据源,但我不知道在OnDrawCell事件之前在 dbgrid 组件上调用了什么。
从 db.pas 数据集正在调用
if (FDisableState <> dsInactive) and (FState <> dsInactive) then
DataEvent(FEnableEvent, 0);
数据源如何通知 dbgrid 它需要显示多少列?
数据源通过数据链接 ( 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.DataSetChanged或TGridDataLink.LayoutChanged,取决于之前发生的事情EnableControls被调用。对记录的编辑是数据集的更改;添加字段(网格中的列)是布局更改(除其他外),TGridDataLink呼叫FGrid.DataChanged或FGrid.LayoutChanged,TCustomDBGrid.LayoutChanged最终调用TCustomDBGrid.BeginLayout,TCustomDBGrid.BeginLayout将列(计数、标题等)的更新委托给Columns属性并调用Columns.BeginUpdate.OnDrawCell发生在未来某个时间,当所有布局更改完成时。