Foxtable(狐表)用户栏目专家坐堂 → 事件触发参数e是什么类型


  共有3559人关注过本帖树形打印复制链接

主题:事件触发参数e是什么类型

帅哥哟,离线,有人找我吗?
arthurshoe
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
事件触发参数e是什么类型  发帖心情 Post By:2014/10/31 23:33:00 [只看该作者]

做一个通用的验证,需要把datacolchanging的事件触发参数e传到函数里面。。
e的类型是什么? Dim triger As ??


 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/10/31 23:47:00 [只看该作者]

您需要什么?需要表名?还是什么?您要的什么类型的数据?

 回到顶部
帅哥哟,离线,有人找我吗?
arthurshoe
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
程兴刚
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:7258 积分:40773 威望:0 精华:16 注册:2008/8/31 23:23:00
  发帖心情 Post By:2014/11/1 13:01:00 [只看该作者]

您把问题想复杂了!

 回到顶部
帅哥哟,离线,有人找我吗?
arthurshoe
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
  发帖心情 Post By:2014/11/1 13:18:00 [只看该作者]

是的。。后来修改了很多。。。最后还是直接在beforesavedatarow直接写好点,不过学习过程中学到不少东西。。。呵呵!!!

 回到顶部
帅哥哟,离线,有人找我吗?
逛逛
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:1693 积分:12135 威望:0 精华:7 注册:2013/7/11 10:52:00
  发帖心情 Post By:2014/11/1 15:46:00 [只看该作者]

思路不错,但方法不赞同。

 

空值检查是常用的,做成函数会减少很多的代码量。

 

个人观点

 

1、传入行集合和字段集合

 

2、遍历字段集合获取字段类型

 

3、遍历行集合判断空值

 

4、返回逻辑值,是否存在空值

 


 回到顶部
帅哥哟,离线,有人找我吗?
arthurshoe
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
  发帖心情 Post By: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编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
关键下一秒
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:四尾狐 帖子:816 积分:6685 威望:0 精华:2 注册:2012/8/23 12:35:00
  发帖心情 Post By:2014/11/2 0:03:00 [只看该作者]

dim e as object = args(0)  '所有事件e参数一律用object传递比较方便。

 回到顶部
帅哥哟,离线,有人找我吗?
arthurshoe
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
  发帖心情 Post By:2014/11/2 0:08:00 [只看该作者]

但是e.DataRow不是每一个触发都用的上的。。。因为是主要的数据验证最终还是要在beforesavedatarow里验证是最安全的。。。
按照以上思路,做成通用的模块式绝对可行的(自动判别列的类型判断,IsDate 和IsNumeric,IsBoolean 等,自动提示)。。。以后发点时间看看。。

 回到顶部
帅哥哟,离线,有人找我吗?
arthurshoe
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:265 积分:1806 威望:0 精华:0 注册:2014/3/29 9:27:00
  发帖心情 Post By: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编辑过]

 回到顶部