禁止输入重复值

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

禁止单列输入重复值

假定有个订单表,要求订单号列不能输入重复值,可以将这个表的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事件代码设置为:

Select Case e.DataCol.name
    Case "型号","规格"
        Dim xh As String
        Dim gg As String
        If e.DataCol.Name= "型号" Then
            xh = e.NewValue
            gg = e.DataRow("规格")
        Else
            gg = e.NewValue
            xh = e.DataRow("型号")
        End If
        If xh > "" AndAlso gg  > "" Then
           
Dim dr As DataRow = e.DataRow
            If e.DataTable.Find("
型号 = '" & xh & "' And 规格 = '" & gg & "'") IsNot Nothing Then
                MessageBox.Show("
已经存在相同型号和规格的行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
                e.Cancel = True
            End If
        End If

End
Select

上面的代码有点繁琐。

我们可以变通一下,改为DataColChanged事件事件代码 ,同样可以禁止输入型号和规格相同的行,而且代码会简洁一些:

Select Case e.DataCol.name
    Case
"型号","规格"
       
Dim dr As DataRow = e.DataRow
       
If dr.IsNull("型号") = False AndAlso dr.IsNull("规格") = False Then
            If e.DataTable.Compute("Count([_Identify])","型号 = '" & dr("型号") & "' And 规格 = '" & dr("规格") & "'") > 1 Then
                MessageBox.Show(
"已经存在相同型号和规格的行!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information)
                e.
DataRow(e.DataCol.Name) = e.OldValue '取消输入
           
End If
        End
If
End
Select

不过两者还是有所差别的,DataColChanging是在值发生变化前进行判断,属于提前拦截,而DataColChanged是在值发生变化后判断,属于事后弥补。


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