以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  [求助]DataColChanging不包含ValidateEdit的功能吗?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=139188)

--  作者:shenyl0211
--  发布时间:2019/8/7 18:01:00
--  [求助]DataColChanging不包含ValidateEdit的功能吗?
ValidateEdit事件中的说明如下:
  ValidateEditDataColChanging有些类似,但是ValidateEdit针对的是输入验证,而DataColChanging使用范围更广(言下之意包括了输入验证),因为任何形式导致的数据变动,包括输入以及通过代码设置,都会触发DataColChanging事件。所以实际开发的时候,最好DataColChanging事件,除非你的代码仅仅用于输入验证
  我的理解是:DataColChanging可以替代ValidateEdit。但以下两段最常用的代码(整数列输入小数时自动取整功能)结果却完全不一样,难道是我的代码有问题吗?请指教。谢谢!

  ValidateEdit事件中的下列代码执行结果是正确的:
Dim dc As DataCol = e.Col.DataCol
If dc.IsNumeric Then
  Dim v1 As Decimal
  If e.Text > "" Then
    v1 = val(e.Text)
  Else
    Return
  End If
  If dc.Datatype.name = "Int32" then
    If v1 > 2.1E9 Then
      e.Cancel = True
    ElseIf v1 < -2.1E9 Then
      e.Cancel = True
    ElseIf v1 <> cint(v1) Then
      e.text = cint(v1)
    End If
  End If
End if
  DataColChanging事件中的下列代码执行结果是错误的,小数(如1.1)被清空,但整数(如1)有效
Dim dc As DataCol = e.DataCol
If dc.IsNumeric Then
  Dim v1 As Decimal
  If e.NewValue <> 0 Then
    v1 = e.NewValue
  Else
    Return
  End If
  If dc.Datatype.name = "Int32" Then
    If v1 > 2.1E9 Then
      e.Cancel = True
    ElseIf v1 < -2.1E9 Then
      e.Cancel = True
    ElseIf v1 <> cint(v1) Then
      e.NewValue = cint(v1)
    End If
  End If
End If

[此贴子已经被作者于2019/8/7 20:45:59编辑过]

--  作者:有点蓝
--  发布时间:2019/8/8 8:56:00
--  
只能使用ValidateEdit事件。因为这2个事件触发的时机不一样。

ValidateEdit事件在数据录入后退出编辑状态的时候做验证,这时数据还没有写入单元格
DataColChanging事件是数据被写入单元格的时候触发。由于是整数列,输入1.1默认被认为是不合法的数据被丢弃,这个事件根本都没有触发

--  作者:shenyl0211
--  发布时间:2019/8/8 10:56:00
--  
谢谢蓝版。我是在看《宝典》的时候想起了这种测试的。
看来,帮助文档和《宝典》对这两事件的解释都不太恰当。
但是,DataRowAdding完全可由DataRowAdded代替,而且后者提示也非常有用,特别是对于网上审批的应用。

--  作者:有点蓝
--  发布时间:2019/8/8 11:04:00
--  
每个事件都有其使用场合,如果可以完全代替,官方又何必搞这么多重复的事件!

何况帮助文档也没有说可以完全代替,那只是您的个人理解不一样而已