快速入门

假定有A、B、C三列,这三列都是数值型,其中C列等于A列加上B列。
对于这种简单的计算,我们完全可以用表达式完成,假定C列是一个表达式列,只需将该列的表达式设为:

[A] + [B]

但是本节我们不用表达式,而是用代码来实现同样的计算。

任何一个数据列的内容发生变化,都会触发表的DataColChanged事件。
我们可以在DataColChanged中设置代码,实现列与列之间的计算。
需要注意的是:

1、如果某一列需要通过事件代码来计算求值,那么该列必须是一个数据列,不能是一个表达式列。
2、表达式列的内容发生变化,是不会触发DataColChanged事件的。

我们用这样一个最简单的列子,是为了让大家快速掌握如何用代码来实现计算。
首先我们得确保A、B、C三列都是数据列,而不是表达式列,然后将这个表的DataColChanged事件设为:

e.DataRow("C") = e.DataRow("A") + e.DataRow("B")

上面的代码设置完成后,只要在A列或B列输入内容,C列就会自动显示这两列之和。很简单,是不是?

不过我们还得完善一下代码,因为任何一列发生变化,都会触发DataColChanged事件,从而重算C列的内容。
显然,这样的代码,效率太低,最好加一个判断,只有A列或B列的内容发生变化,才重算C列:

If e.DataCol.Name = "A" OrElse e.DataCol.Name = "B" Then
    e.
DataRow("C") = e.DataRow("A") + e.DataRow("B")
End
If

现在的问题是,上面的代码只对新输入的数据有效,这是显然的,因为DataColChanged本来就只会在某列内容发生变化后执行。
那么如何要求原有的行,按照新设置的代码,重新计算C列的值呢?很简单,只需选定A列或B列中的任何一列,然后在“数据表”功能区“列相关”功能组,单击下面的“重置”按钮:

即可重算所有行的C列值。

菜单的“日常工作”功能区,也有重置列的按钮:

重置命令相当于“欺骗”性地通知系统:某一列(被重置的列)的内容发生了变化;系统收到这个虚假通知后,开始执行DataColChanged事件代码,间接实现了重算的目的。
需要注意的是,不能选择C列来执行重置命令,必须选择A列或B列中的一个,这是因为我们在DataColChanged中加入了判断条件,只有这两列的内容发生变化,才会重算C列的值。

我们也可以通过编码来重置某一列,例如重置B列:

DataTables("表名").DataCols("B").RaiseDataColChanged()

假定这个表包括两个计算关系,C列等于A列加上B列,F列等于D列加上E列,按照前面的编码方式,我们只需将DataColChanged事件改为:

If e.DataCol.Name = "A" OrElse e.DataCol.Name = "B" Then
    e.DataRow("C") = e.DataRow("A") + e.DataRow("B")
ElseIf
e.DataCol.Name = "D" OrElse e.DataCol.Name = "E" Then
   
e.DataRow("F") = e.DataRow("D") + e.DataRow("E")
End
If

上面的代码看上去有点繁多,我们可以改用Select Case语句:

Select Case e.Datacol.Name
   
Case "A","B"
        e
.DataRow("C") = e.DataRow("A") + e.DataRow("B")
   
Case "D","E"
        e
.DataRow("F") = e.DataRow("D") + e.DataRow("E")
End
Select

显然,在存在多个计算关系的时候,或者多列参与计算的时候,用Select Case语句更简洁一些。

上面的代码反复使用了e.DataRow,我们可以用一个变量来代替它,使得代码更加简洁:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
    Case "A","B"
        dr(
"C") = dr("A") + dr("B")
   
Case "D","E"
        dr(
"F") = dr("D") + dr("E")
End
Select


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