我需要知道当数据集调用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
的类型。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.DataSetChanged
或TGridDataLink.LayoutChanged
,取决于之前发生的事情EnableControls
被调用。对记录的编辑是数据集的更改;添加字段(网格中的列)是布局更改(除其他外),TGridDataLink
呼叫FGrid.DataChanged
或FGrid.LayoutChanged
,TCustomDBGrid.LayoutChanged
最终调用TCustomDBGrid.BeginLayout
,TCustomDBGrid.BeginLayout
将列(计数、标题等)的更新委托给Columns
属性并调用Columns.BeginUpdate
.OnDrawCell
发生在未来某个时间,当所有布局更改完成时。