以文本方式查看主题

-  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编辑过]