两种类型的表事件

表事件有两种,一种是针对DataTable的,一种是针对Table的。

我们用一个简单的例子来说明为什么会有两种表事件。

假定产品表和订单表通过产品编号建立了关联,那么对于订单表,会有两个Table,分别是:

Tables("订单")
Tables("产品.订单")

前者是主表,显示所有订单,后者是关联表,在产品表选择某产品时,此关联表显示该产品的全部订单。

当然,订单表的DataTable还是一个:

DataTables("订单")

Foxtable提供了一个表事件PrepareEdit,这个事件在用户编辑某一个单元格之前触发;用户可能在主表Tables("订单")中编辑数据,也可能在关联表Tables("产品.订单")中编辑数据,显然PrepareEdit事件必须能告诉我们用户到底是在哪一个Table中编辑数据,以及编辑的是哪一列,哪一行;所以PrepareEdit事件是针对Table的,该事件的e参数提供了以下信息:

Table:       准备编辑的表
Row:         准备编辑的行
Col:         准备编辑的列
Cancel:      逻辑型,默认为False,设为True取消编辑。

实际上,DataTable是不可见的,我们不可能去编辑它,我们只能编辑看得见的Table,所以PrepareEdit事件只能是针对Table的,而不可能针对DataTable。

表中某一列的内容发生变化后会触发DataColChanged事件,这个事件是针对DataTable的,因为存放数据的是DataTable,不管用户在主表Tables("订单")中编辑数据,还是在关联表Tables("产品.订单")中编辑数据,或者因为代码导致订单表中的数据发生变化,最终影响的都是DataTables("订单")中的数据,Table只是从DataTable中提取数据呈现给用户而已;我们不需要知道导致列内容发生变化的原因,只需要知道发生变化的是哪个表的哪一行的哪一列,所以DataColChanged事件的e参数属性提供了以下信息:

DataTable : 发生变化的表
DataCol:    发生变化的列
DataRow:    发生变化的行

如果你还是不能理解,那么我们看看如果DataColChanged事件针对Table的时候,会带来怎样的后果; 假定我们在命令窗口执行下面的代码:

Dim r As DataRow
r = DataTables("订单").DataRows(0)
r(
"数量") = 100

上面的代码直接通过DataRow设置了数量列的内容,因为一个DataTable对应有多个Table,同样一个DataRow可能会出现在多个Table中,从而对应有多个Row,如果DataColChanged是针对Table的,那么此时应该针对哪一个Table和Row来触发此事件呢?如果极端一点,我们在Table中进行了筛选,而 某一行不符合筛选条件,没有出现在任何Table中,那么使用代码修改此行的值后,又该如何触发DataColChanged事件呢?
显然DataColChanged这样的事件,只有针对DataTable才合理,上面的问题才不复存在。

实际学习和应用的时候,判断一个事件是针对Table的还是针对DataTable,是很简单直观的,我们只需看其e参数属性即可:

 


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