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