DataColChanged
某一列的内容被更改后执行,此时列的内容已经是更改后的值。
e参数属性:
DataTable:返回发生数据更改的数据表。
DataRow: 返回发生数据更改的数据行。
DataCol: 返回发生数据更改的数据列。
NewValue: Object类型,表示新的值。
OldValue: Object类型,表示旧的值
示例一
假定在客户消费数据表中,有一逻辑型数据列,列名为“已结帐”,我们希望对于已结帐的行,能够自动通过审核(锁定),以免被误编辑。
为实现这个目标,只需在DataColChanged事件中设置如下代码即可:
If e.DataCol.Name = "已结帐" Then '如果是已结帐列的内容变动
If e.NewValue = True Then '而且变动后的值是True(已勾选)
e.DataRow.Locked = True '那么锁定此行
End If
End If
示例二
列与列之间的计算,我们通常用表达式列来实现,但不是所有的计算都可以通过表达式来完成的。
例如员工表中有身份证号码、出生日期列,出生日期根据身份证号码计算得出。
为了自动计算出生日期,可以在员工表的的DataColChanged事件中加入下面的代码:
If
e.DataCol.Name = "身份证号码" Then '如果更改的是身份证号码列
If e.DataRow.IsNull("身份证号码") Then '身份证号码是否为空
e.DataRow("出生日期") = Nothing '如果为空,则清除出生日期
Else
'否则从身份证号码列中提取出生日期
e.DataRow("出生日期") = ReadBirthday(e.DataRow("身份证号码"))
End If
End If
如果表中已经输入数据,那么在加入上述代码后,选择身份证号码列,然后在“数据表”功能区“列相关”功能组,单击下面的“重置”按钮:
即可计算出所有行的出生日期,今后新增数据或者修改身份证号码,出生日期可以自动计算得出,无需人工干预。
上面代码中,e.DataRow("身份证号码")和e.NewValue实际上是相等的,因为DataColChanged执行的时候,新值已经写入到表中。
所以下面这行代码:
e.DataRow("出生日期") = ReadBirthday(e.DataRow("身份证号码"))
等效于:
e.DataRow("出生日期") = ReadBirthday(e.NewValue)
同样,因为新的值已经写入表中,所以如果要判断旧的值是否为空,只能用:e.OldValue Is Nothing。
如果要判断新值是否为空,则既可用:e.NewValue Is Nothing,也可用IsNull方法判断 ,如上面的: e.DataRow.IsNull("身份证号码")。
切不可用 e.DataRow("列名") Is Nothing 来判断新值是否为空,因为对于数值列,如果值为空,e.DataRow("列名")返回的是0,如果是日期列,则返回#01/01/0001#,显然这都不是空值。
示例三
可以肯定的是,一个表的列与列之间的计算关系往往不只一个。
假定一个表同时包括示例一和示例二的计算关系,你可以将这些代码简单地复制在一起,也可以用If... ElseIf...End If改写:
If
e.DataCol.Name = "已结帐" Then
If e.NewValue = True Then
e.DataRow.Locked = True
End If
ElseIf e.DataCol.Name = "身份证号码" Then
If e.DataRow.IsNull("身份证号码") Then
e.DataRow("出生日期") = Nothing
Else
e.DataRow("出生日期") = ReadBirthday(e.NewValue)
End If
End If
或者采用Select Case语句进行条件分支判断:
Select
Case e.DataCol.Name
Case "已结帐"
If e.NewValue = True Then
e.DataRow.Locked = True
End If
Case "身份证号码"
If e.DataRow.IsNull("身份证号码") Then
e.DataRow("出生日期") = Nothing
Else
e.DataRow("出生日期") = ReadBirthday(e.NewValue)
End If
End Select
我个人偏好Select Case语句,因为看上去更清晰简洁一些。
一些逻辑较为复杂的关系,可能需要多个Select Case语句才能表述:
Select
Case e.DataCol.Name
Case "A列"
'代码一
Case "B列"
'代码二
Case "E列"
'代码三
End Select
Select Case e.DataCol.Name
Case "A列","B列","C列"
'代码四
Case "E列", "F列"
'代码五
End Select
上面这段代码有两个Select Case语句,如果修改的是A列,则执行代码一和代码四,如果修改的是E列,则执行代码三和代码五,如果修改的是F列,则只执行代码五。