以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- 事件触发参数e是什么类型 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=59279) |
-- 作者:arthurshoe -- 发布时间:2014/10/31 23:33:00 -- 事件触发参数e是什么类型 做一个通用的验证,需要把datacolchanging的事件触发参数e传到函数里面。。 e的类型是什么? Dim triger As ?? |
-- 作者:程兴刚 -- 发布时间:2014/10/31 23:47:00 -- 您需要什么?需要表名?还是什么?您要的什么类型的数据? |
-- 作者:arthurshoe -- 发布时间:2014/11/1 1:03:00 -- 谢谢。。找到了。。我只是想吧 e 传到 函数里面。。。。可能直接引用 Args也能使用。。 后来发现 e 是 DataColEventArgs 类。。 比如像做一个验证字段不能为空的函数NotNull,代码 Dim e As DataColEventArgs = Args(0) Dim col_names() As String = Args(1) For i As Integer = 0 To col_names.length -1 If e.NewValue Is Nothing Then e.Cancel = True MessageBox.Show(col_names(i) & " 不能为空!") Return -1 End If Next Return 1 这样在datacolchanging 里面就可以 写 Functions.execute("NotNull", e, New String(){"列一",“列二”,“列三”。。。。。。}) 因为很多表格,很多字段都需要这个判断。。所以写个通用的函数。。上面可能对日期型,不知道需不需要另作判断。。还要做测试 其他类似于唯一性判断也可以这样。。。 发现NotNul应该放在 beforesavedatarow ,因为如果数据没有修改是不能触发datarowchanging的。 Dim e As DataRowEventArgs = Args(0) Dim col_names() As String = Args(1) For i As Integer = 0 To col_names.length -1 If e.DataRow.IsNull(Col_names(i)) Then e.Cancel = True MessageBox.Show(col_names(i) & " 不能为空!") Return -1 End If Next Return 1 [此贴子已经被作者于2014-11-1 1:34:17编辑过]
|
-- 作者:程兴刚 -- 发布时间:2014/11/1 13:01:00 -- 您把问题想复杂了! |
-- 作者:arthurshoe -- 发布时间:2014/11/1 13:18:00 -- 是的。。后来修改了很多。。。最后还是直接在beforesavedatarow直接写好点,不过学习过程中学到不少东西。。。呵呵!!! |
-- 作者:逛逛 -- 发布时间:2014/11/1 15:46:00 -- 思路不错,但方法不赞同。
空值检查是常用的,做成函数会减少很多的代码量。
个人观点
1、传入行集合和字段集合
2、遍历字段集合获取字段类型
3、遍历行集合判断空值
4、返回逻辑值,是否存在空值
|
-- 作者:arthurshoe -- 发布时间:2014/11/1 23:51:00 -- 后来又总结了一下,之前是想做成一个通用的判断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编辑过]
|
-- 作者:关键下一秒 -- 发布时间:2014/11/2 0:03:00 -- dim e as object = args(0) \'所有事件e参数一律用object传递比较方便。 |
-- 作者:arthurshoe -- 发布时间:2014/11/2 0:08:00 -- 但是e.DataRow不是每一个触发都用的上的。。。因为是主要的数据验证最终还是要在beforesavedatarow里验证是最安全的。。。 按照以上思路,做成通用的模块式绝对可行的(自动判别列的类型判断,IsDate 和IsNumeric,IsBoolean 等,自动提示)。。。以后发点时间看看。。
|
-- 作者:arthurshoe -- 发布时间:2014/11/2 0:43:00 -- 写了一个other_validate,但是发现没有IsBoolean这个函数,是不是IsNumberic其实就可以代替,因为boolean数据库里面就是0和1或者是其他数据,应该和数据库相关 Dim e As DataRowEventArgs = Args(0) For Each dc As DataCol In e.DataTable.DataCols If dc.IsBoolean AndAlso IsNumeric(e.DataRow(dc.Name)) = False Then e.Cancel = True MessageBox("字段 " & dc.name " 不是逻辑值!") Return False ElseIf dc.IsNumeric AndAlso IsNumeric(e.DataRow(dc.Name)) = False Then e.Cancel = True MessageBox("字段 " & dc.name " 不是数字值!") Return False ElseIf dc.IsDate AndAlso IsDate(e.DataRow(dc.Name)) = False Then e.Cancel = True MessageBox("字段 " & dc.name " 不是日期值!") Return False End If Next Return True 做普通验证时就只要 If Functions.execute("NotNull",e,"列“。。) AndAlso Functions.execute("Unique",e,"列"。。) AndAlso Functions.execute("Other_Validate",e) then
\'特殊的业务逻辑判断写在这里。。。。 end If
[此贴子已经被作者于2014-11-2 0:45:04编辑过]
|