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
    If
e.OldValue = "A" Then
'如果原来的等级是A
       
If e.NewValue = "D" Then '且新的等级为D
            e.Cancel =
True '则取消更改
       
End If
   
End If
End
If

在上面的代码中,e.OldVaue等效于e.DataRow("等级"),因为DataColChanging事件触发的时候,新的值还没有写入到表中。

所以上面的代码也可以改写为:

If e.DataCol.Name = "等级" Then
    If
e.DataRow("等级") = "A" Then '如果原来的等级是A
       
If e.NewValue = "D" Then '且新的等级为D
            e.Cancel =
True '则取消更改
       
End If
   
End If
End
If

示例三

通过更改NewValue参数的值,我们可以实现代码输入,例如:

If e.DataCol.Name = "产品" Then '如果是产品列的内容发生变化。
   
If e.NewValue = "tv" Then '如果新值是"tv"。
        e.NewValue =
"电视机" '那么将"tv"替换为"电视机"
   
ElseIf e.NewValue = "tel" Then '如果新值是"tel"
        e.NewValue =
"电话机" '那么将"tel"替换为"电话机"
   
End If
End
If

在DataColChanging事件中设置上述代码后,如果你在产品列输入tv,将自动替换为电视机,如果输入tel, 将自动替换为电话机。

示例四

我们知道,列有禁止输入重复内容的属性,不过这个属性有局限,就是只有直接在表格中输入的时候才有效,如果你通过窗口输入或者是通过代码设置,同样可以输入重复内容。

我们可以在DataColChanging事件中设置代码,使得不管通过任何方式修改列的内容,都不能输入重复值,例如希望订单号列不能输入重复值:

If e.DataCol.Name = "订单号" Then
    Dim
dr As DataRow
    dr = e.
DataTable.Find("订单号 = '" & e.NewValue & "'")
   
If dr IsNot Nothing Then
        MessageBox.Show(
"此订单号已经存在!")
        e.Cancel =
True
    End
If
End
If

示例五

如果要允许修改订单号,但禁止删除订单号,也就是说订单号列内容不允许为空,可以将DataColChanging事件代码设置为:

If e.DataCol.Name = "订单号" Then
    If
e.NewValue Is Nothing Then
        MessageBox.Show(
"订单号不允许为空!")
        e.Cancel =
True
    End
If
End
If

前面提到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
e.NewValue > 0.15 Then
        e
.Cancel = True
    End If
End If
If
e.DataCol.Name = "产品" Then
    If
e.NewValue = "tv" Then
        e
.NewValue = "电视机"
    ElseIf
e.NewValue = "tel"
       
e.NewValue = "电话机"
    End If
End If
If
e.DataCol.Name = "工号" Then
    Dim
dr As DataRow
    dr
= e.DataTable.Find("工号 = '" & e.NewValue & "'")
    If
dr IsNot Nothing Then
        MessageBox
.Show("此工号已经存在!")
        e
.Cancel = True
    End If
End If

也可以用If... ElseIf...End If改写,使得代码看上去有条理一点:

If e.DataCol.Name = "折扣" Then
    If e.NewValue > 0.15 Then
        e.Cancel =
True
   
End If
ElseIf
e.DataCol.Name = "产品" Then
   
If e.NewValue = "tv" Then
        e.NewValue =
"电视机"
   
ElseIf e.NewValue = "tel"
        e.NewValue =
"电话机"
   
End If
ElseIf
e.DataCol.Name = "工号" Then
    Dim dr As DataRow
    dr = e.
DataTable.Find("工号 = '" & e.NewValue & "'")
    If
dr IsNot Nothing
Then
        MessageBox.Show(
"此工号已经存在!")
        e.Cancel =
True
   
End If
End
If

或者用Select Case语句改写:

Select Case e.DataCol.Name
    Case
"折扣"
       
If e.NewValue > 0.15 Then
            e.Cancel =
True
        End
If
    Case
"产品"
       
If e.NewValue = "tv" Then
            e.NewValue =
"电视机"
       
ElseIf e.NewValue = "tel"
            e.NewValue =
"电话机"
       
End If
    Case
"工号"
       
Dim dr As DataRow
        dr = e.
DataTable.Find("工号 = '" & e.NewValue & "'")
        If
dr IsNot Nothing Then
            MessageBox.Show(
"此工号已经存在!")
            e.Cancel =
True
        End
If
End
Select

我个人偏好Select Case语句,因为看上去更清晰简洁一些。


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