当前表与表事件
很多用户在写表事件代码的时候,往往忽视事件的e参数,直接使用CurrentTable和Current来表示触发事件的表和行。
例如有人在DataColChanged事件写出下面的代码:
Dim
dr As Row = CurrentTable.Current这段代码表面上没有什么问题,实际上存在严重的漏洞,因为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其实很轻松
我们知道,Foxtable有两种类型的表事件,分别是针对DataTable和Table的,它们的e参数是不同的,参考:两种类型的表事件。
就是同一种类型的表事件,e参数也会有一些差异,例如同样是针对Table的表事件DrawCell和AfterEdit,其e参数就有比较大的差异
。
不过我们不要刻意记忆任何e参数,因为在实际编写代码的时候,可以很方便地查看表事件的e参数:
此外在编写代码的时候,输入"e.",也会列出所有的e参数及其说明, 还可以自动输入,以PrepareEdit事件为例: