DataColChanging
某一列的内容发生变化前执行,此时新值还没有写入表中,列的内容还是更改前的值。
利用此事件,我们可以在某列内容发生变化之前进行拦截判断,如果不符合特定的条件,则取消此次变化,或者重新指定一个值。
e参数属性:
DataTable: 返回发生数据更改的数据表。
DataRow: 返回发生数据更改的数据行。
DataCol: 返回数据更改的数据列。
NewValue: Object类型,表示新的值
OldValue: Object类型,表示旧的值
Cancel: 逻辑(Boolean)类型,设为True取消更改。
示例一
例如在订单表中,要求折扣列的值不能超过0.15,可以在DataColChanging事件中设置如下代码:
If e.DataCol.Name =
"折扣"
Then
'如果是折扣列的内容发生变化。
If
e.NewValue > 0.15
Then
'如果新值大于0.15。
e.Cancel =
True
'取消变动。
End
If
End
If
上面的代码在折扣超出0.15后,取消此次变动;如果希望在折扣超出0.15后,自动改为0.15,代码如下:
If e.DataCol.Name
= "折扣"
Then '如果是折扣列的内容发生变化。
If e.NewValue
> 0.15
Then '如果输入的内容大于0.15。
e.NewValue
= 0.15
'那么改为0.15。
End If
End If
示例二
DataColChanging事件触发时,列中的值还没有更改,还是原来的值。这样我们就可以对新值和旧值进行比较。
例如假定表中有一列为“等级”,禁止将等级"A"调整为等级"D",只需将DataColChanging事件代码设为:
If
e.DataCol.Name = "等级" Then在上面的代码中,e.OldVaue等效于e.DataRow("等级"),因为DataColChanging事件触发的时候,新的值还没有写入到表中。
所以上面的代码也可以改写为:
If
e.DataCol.Name = "等级" Then示例三
通过更改NewValue参数的值,我们可以实现代码输入,例如:
If
e.DataCol.Name = "产品" Then '如果是产品列的内容发生变化。在DataColChanging事件中设置上述代码后,如果你在产品列输入tv,将自动替换为电视机,如果输入tel, 将自动替换为电话机。
示例四
我们知道,列有禁止输入重复内容的属性,不过这个属性有局限,就是只有直接在表格中输入的时候才有效,如果你通过窗口输入或者是通过代码设置,同样可以输入重复内容。
我们可以在DataColChanging事件中设置代码,使得不管通过任何方式修改列的内容,都不能输入重复值,例如希望订单号列不能输入重复值:
If
e.DataCol.Name = "订单号" Then示例五
如果要允许修改订单号,但禁止删除订单号,也就是说订单号列内容不允许为空,可以将DataColChanging事件代码设置为:
If
e.DataCol.Name = "订单号" Then前面提到DataColChanging事件触发的时候,新的值还没有写入表中,所以如果要判断新的值是否为空,只能用:e.NewValue
Is Nothing。
如果要判断旧值是否为空,则既可用:e.OldValue Is Nothing,也可用IsNull方法判断:
e.DataRow.IsNull("列名")。
切不可用
e.DataRow("列名")
Is Nothing
来判断旧值是否为空,因为对于数值列,如果值为空,e.DataRow("列名")返回的是0,如果是日期列,则返回#01/01/0001#,显然这都不是空值。
示例六
显然一个表中会存在多种判断,可以将这些代码简单地组合在一起:
If
e.DataCol.Name = "折扣" Then也可以用If... ElseIf...End If改写,使得代码看上去有条理一点:
If
e.DataCol.Name = "折扣" Then或者用Select Case语句改写:
Select
Case e.DataCol.Name我个人偏好Select Case语句,因为看上去更清晰简洁一些。