强行触发事件
Table有两个特别的方法,分别是:
RaiseCurrentChanged: 强行触发此Table的CurrentChanged事件
RaisePositionChanged:强行触发此Table的PositionChanged事件。
示例
假定有个订单表,希望每次选择一个订单的时候,能够自动在状态栏显示此订单客户的总订单数、总订购数量,为此可以将订单表的CurrentChanged事件代码设置为:
Dim
flt As
String = "客户 = '"
& Tables("订单").Current("客户")
&
"'"
Dim
cnt As
Integer =
DataTables("订单").Compute("Count([_Identify])",flt)
Dim
sum As
Integer =
DataTables("订单").Compute("Sum([数量])",flt)
StatusBar.Message1 =
"订单数:"
& cnt &
" 订购数量:"
& sum
现在有个新的要求,希望在订单表修改客户列或者数量列内容是,能够自动刷新上面统计结果,我们可以在DataColChanged加上类似的统计代码:
Select
Case e.DataCol.name
Case
"客户","数量"
If e.DataRow("_Identify")
= Tables("订单").Current("_Identify")
'如果发生变化的是当前行
Dim
flt As
String = "客户 = '"
& Tables("订单").Current("客户")
& "'"
Dim
cnt As
Integer =
DataTables("订单").Compute("Count([_Identify])",flt)
Dim sum
As Integer
= DataTables("订单").Compute("Sum([数量])",flt)
StatusBar.Message1
= "订单数:" &
cnt &
" 订购数量:" &
sum
End
If
End
Select
这样的设计没有大的问题,但是同样的代码出现在两个地方,不仅代码冗余,而且不利于维护,因为如果要调整代码,就必须同时修改这两处的代码。
我们可以将DataColChanged事件代码改为:
Select
Case e.DataCol.name
Case
"客户","数量"
If e.DataRow("_Identify")
= Tables("订单").Current("_Identify")
'如果发生变化的是当前行
Tables("订单").RaiseCurrentChanged()
'触发订单表的CurrentChanged事件,相当于重新统计一次。
End
If
End
Select
上述代码可以完成了同样的任务,但是代码精炼了很多,维护起来也方便了很多,因为统计代码只出现在CurrentChanged事件。