后来又总结了一下,之前是想做成一个通用的判断Null和Unique(唯一性的)的函数,发现如果用写成通用,其实调用起来和单独直接在事件里写已经差不多。。后来发现,本来就是要省代码量的,直接写成一个只针对BeforeDataRowSave的函数。。。e.cancel=true和提示错误信息页也写进内部函数,个人感觉确省了很多工作量,
把思路和代码贴出来,希望大家给意见
NotNull
'传送beforesavedatarow 的 e 事件和要判断的列名称串进来
' 如 Functions.excucte("NotNull",e,"列1","列2"....)
Dim e As DataRowEventArgs = Args(0)
For i As Integer = 1 To Args.length -1
If e.DataRow.IsNull(Args(i)) Then
e.Cancel = True
MessageBox.Show(Args(i) & " 不能为空!")
Return False
End If
Next
Return True
函数Unique
Dim e As DataRowEventArgs = Args(0)
Dim f As String
Dim cols As String
For i As Integer = 1 To Args.Length -1
f = f & "[" & Args(i) & "]='" & e.DataRow(Args(i)) & "' AND "
cols = cols & Args(i) & " "
Next
f = f & " [_identify] <>" & e.DataRow("_identify")
If e.DataTable.SQLFind(f) IsNot Nothing Then
e.Cancel = True
MessageBox.Show( cols & " 的值不能重复!")
Return False
End If
Return True
调用其实现在就简单了
If Functions.Execute("NotNull", e, "工厂款号","配色","帮面材料","大底材料","分类","季度","号码","图片","日期","码段") AndAlso Functions.Execute("Unique",e,"工厂号款") Then
If IsDate(e.DataRow("日期")) = False
e.Cancel = True
MessageBox.Show("日期列 值不是日期型!")
End If
End If
确实省掉很多代码。。。。记得里面用的是AndAlso 不是And。。。还有事先判断NotNull,然后才是Unique。。。
Unique支持 多字段组合 主键。。。如果希望把一些IsNumeric IsDate等函数也写成内部函数的话,普通验证就更简单。。
将来普通验证的调用变成
if Functions.exect(1) AndAlso Functions.execute(2) AndAlso Functions.execute(3)... Then
End if
感觉可以延伸这个思路,在结合楼上的自动取得和判断列的类型,做成标准模块是可行的。。。希望高手指点。。。
[此贴子已经被作者于2014-11-2 0:03:35编辑过]