当前表与表事件

很多用户在写表事件代码的时候,往往忽视事件的e参数,直接使用CurrentTable和Current来表示触发事件的表和行。

例如有人在DataColChanged事件写出下面的代码:

Dim dr As Row = CurrentTable.Current
Select
Case e.DataCol.Name
   
Case "日期"
        dr(
"年") = dr("日期").Year
        dr(
"月") = dr("日期").Month
End
Select

这段代码表面上没有什么问题,实际上存在严重的漏洞,因为CurrentTable.Current表示当前表的当前行,和触发事件的表和行是两回事。

虽然有些时候,当前表和当前行,确实就是触发事件的表和行,但并非总是如此,例如你在表B设计了一个窗口,这个窗口中的部分TextBox绑定到表A的字段,当你选择表B并打开此窗口,在这些TextBox输入内容的时候,会触发表A的DataColChanged事件,显然此时
CurrentTable.Current表示表B的当前行,并非表A的当前行。

再例如通过代码直接向某个表写入数据:

For Each dr As DataRow In DataTables("A").DataRows
   
dr("日期") = Date.today()
Next

显然,执行上述代码会从表A第一行开始逐行写入日期,从而逐行触发DataColChanged事件,如果你还是用本节开始的内容计算年月,那么除了当前行外,其它行都不会计算。

所以任何时候,都不要在表事件中,用CurrentTable和Current来表示触发事件的表和行,一定要用e参数来引用触发事件的 表和行,例如:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "日期"
        dr(
"年") = dr("日期").Year
        dr(
"月") = dr("日期").Month
End
Select

其实很轻松

我们知道,Foxtable有两种类型的表事件,分别是针对DataTable和Table的,它们的e参数是不同的,参考:两种类型的表事件
就是同一种类型的表事件,e参数也会有一些差异,例如同样是针对Table的表事件DrawCellAfterEdit,其e参数就有比较大的差异 。

不过我们不要刻意记忆任何e参数,因为在实际编写代码的时候,可以很方便地查看表事件的e参数:

此外在编写代码的时候,输入"e.",也会列出所有的e参数及其说明, 还可以自动输入,以PrepareEdit事件为例:


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