全局表事件

在项目属性中,除了可以设置项目事件,还可以设置全局表事件。
全局表事件对所有的表有效,包括通过代码增加的临时表。
全局表事件的e参数和对应的表事件完全一样。

为什么要提供全局表事件呢? 我们用一个最简单的例子说明。
假定我们需要在状态栏,显示当前行位置,以及总的行数,只需在全局表事件
PositionChanged中加入代码:

StatusBar.Message1 = "第" & (e.Table.Position + 1) & "行,共" & e.Table.Rows.Count & "行"

由于全局表事件对所有表有效,所以不管我们选择那个表,状态栏都能显示当前行位置以及总的行数。
如果没有全局表事件,我们就需要在每个表的
PositionChanged加入上述代码,如果有几十个表,就的加入几十次,这将给维护带来极大的不便。

如果你喜欢,你甚至可以不使用表事件,而全部采用全局表事件。
由于全局表事件对所有表有效,而不同的表可能有不同的处理逻辑,需要不同的事件代码,所以通常需要在全局表事件中判断表名:

Select Case e.Table.Name
    Case
"表A"
       
'针对表A的代码
    Case
"表B"
       
'针对表B的代码
    Case
"表C"
       
'针对表C的代码
End Select

或者:

Select Case e.DataTable.Name
    Case
"表A"
       
'针对表A的代码
    Case
"表B"
       
'针对表B的代码
    Case
"表C"
       
'针对表C的代码
End Select

重要提示:

为了提高系统效率,在默认情况下,只有
CurrentChanged、PositionChanged、AfterSelChange、AfterSelRangeChange四个全局表事件对所有表有效, 而其它全局表事件即使设置了代码,也不会发生作用。
当然这并不意味着其它全局表事件永久无效,只是这些表事件需要一个“开关”去开启。
DataTable有一个GlobalHandler属性,该属性包括以下子属性,对应着每一个全局表事件:

AfterCheckRow
AfterDragColumn
AfterEdit
AfterFilter
AfterFreezeColumn
AfterLoad
AfterMoveRow
AfterResizeColumn
AfterResizeRow
AfterSelChange
AfterSelRangeChange
AfterSort
BeforeAddDataRow
BeforeAddFile
BeforeAttachFile
BeforeCheckRow
BeforeDeleteDataRow
BeforeDragColumn
BeforeDrawRow
BeforeFilter
BeforeFreezeColumn
BeforeLoad
BeforeOpenFile
BeforeResizeColumn
BeforeResizeRow
BeforeSaveDataRow
BeforeSelChange
BeforeSelRangeChange
BeforeShowContextMenu
BeforeSort
CellButtonClick
ChangeEdit
Click
CurrentChanged
DataColChanged
DataColChanging
DataRowAdded
DataRowAdding
DataRowDeleted
DataRowDeleting
DataRowLockedChanged
DataRowLockedChanging
DoubleClick
DrawCell
KeyDown
KeyDownEdit
KeyPressEdit
KeyUp
KeyUpEdit
PositionChanged
PrepareEdit
SetupEditor
StartEdit
ValidateEdit
MouseEnterCell
MouseLeaveCell
MouseHoverCell

这些属性都是逻辑型,如果要使某个全局表事件对该DataTable有效,只需将对应的属性设为True即可。
这些属性中,
只有CurrentChanged、PositionChanged、AfterSelChange、AfterSelRangeChange的默认值为True,这也就是为什么默认只有这四个全局表事件有效的原因。

例如要使全局表事件AfterEdit事件对表A有效,只需:

DataTables("表A").GlobalHandler.AfterEdit = True

要使全局表事件AfterEdit事件对所有表有效,只需:

For Each dt As DataTable In DataTables
    dt.GlobalHandler.AfterEdit
= True
Next

应用实例

假定项目中有一个名为“录入员”的用户,希望该用户只能修改新增加的行,不能修改已经保存的行,且这个限制对所有表有效。
首先我们应该在全局表事件PrepareEdit加入代码:


If e.Row.DataRow.RowState <> DataRowState.Added Then
    If User.Name = "录入员"
        e.Cancel =
True
   
End If
End
If

然后在项目事件Initialize加入代码:

For Each dt As DataTable In DataTables
    dt.GlobalHandler.
PrepareEdit = True
Next

这样我们的任务就已经完成,如果没有全局表事件,这将是一个很繁琐的任务,特别是表很多的时候。


本页地址:http://www.foxtable.com/webhelp/topics/0671.htm