快速入门
假定有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现在的问题是,上面的代码只对新输入的数据有效,这是显然的,因为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上面的代码看上去有点繁多,我们可以改用Select Case语句:
Select
Case e.Datacol.Name显然,在存在多个计算关系的时候,或者多列参与计算的时候,用Select Case语句更简洁一些。
上面的代码反复使用了e.DataRow,我们可以用一个变量来代替它,使得代码更加简洁:
Dim
dr As DataRow = e.DataRow