Foxtable(狐表)用户栏目专家坐堂 → [讨论] 关于触发事件的计算顺序问题。


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

主题:[讨论] 关于触发事件的计算顺序问题。

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
[讨论] 关于触发事件的计算顺序问题。  发帖心情 Post By:2009/8/4 23:26:00 [只看该作者]

1、对于datacolchanged事件,在手动输入数据时,是输入一个单元格的数值就执行一次事件代码,我想是这样的。

2、对于用数据填充器的 Filler  填充的数据,是不是也一样,填充一个单元格就执行一次事件代码?还是填充一行就执行一次代码?    请有经验的朋友答复一下。

我想,这个很重要的,涉及执行事件代码如何编写和执行的效率问题。

例如:

我用数据填充器的 Filler  填充进来了:第一列、第二列、第三列、第四列、第五列

我在这个表的datacolchanged事件中写了如下的代码:

Select Case e.datacol.name
    Case
 第一列、第二列、第三列
        代码1

    Case
 第四列、第五列
        代码2

End Select

如果是填充一个单元格就执行一次代码

那么我填充第一列的第一行时,要执行一次代码1
      填充第二列的第一行时,也要执行一次代码1
      填充第三列的第一行时,又要执行一次代码1

这样效率不是很低吗?

实际上,代码1需要第一列、第二列、第三列的值都变化了,才能组合计算出正确结果的。

谁能解释这个效率低下的问题?是我理解有误吗?

是不是整个一行的数据被填充了,才执行一次事件代码?这样的话效率要高些的。


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/8/5 1:11:00 [只看该作者]

就你上面的代码而言,任一单元格数据变动就会执行一次代码。

我想你应该是这个意思吧?

Dim dr As DataRow = e.DataRow
Select Case e.datacol.name
    Case "第一列","第二列","第三列"
        If dr.IsNull("第一列") = False And dr.IsNull("第二列") = False And dr.IsNull("第三列") = False Then
            代码1
        End If
    Case "第四列","第五列"
        代码2
End Select

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/8/5 1:15:00 [只看该作者]

请教下老六,如何利用NewValue和单元格中的原有值进行比较?

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


加好友 发短信
等级:管理员 帖子:47477 积分:251256 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/8/5 1:24:00 [只看该作者]

以下是引用czy在2009-8-5 1:15:00的发言:
请教下老六,如何利用NewValue和单元格中的原有值进行比较?


在DataColChanging事件中,e.DataRow("列名")返回原来的值,可以和e.NewValue比较
在DataColChanged事件中,e.Dataow("列名")和e.NewValue相等,无法比较。

楼主的问题,可以用一个全局变量做开关,在事件中判断全局变量的值,为True执行,为False返回。


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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/8/5 1:27:00 [只看该作者]

以下是引用狐狸爸爸在2009-8-5 1:24:00的发言:


在DataColChanging事件中,e.DataRow("列名")返回原来的值,可以和e.NewValue比较
在DataColChanged事件中,e.Dataow("列名")和e.NewValue相等,无法比较。

楼主的问题,可以用一个全局变量做开关,在事件中判断全局变量的值,为True执行,为False返回。


我上面是就事论事,其实最好的办法还是填充完了再一次性进行计算更好。


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


加好友 发短信
等级:管理员 帖子:47477 积分:251256 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/8/5 1:31:00 [只看该作者]

是的,如果数据是填充来的,而不是输入的,就没有要用事件了,统一计算最好。

如果填充后还是需要编辑,那么事件就省不掉,此时最好用全局变量做开关,填充的时候时候,关闭计算代码,填充结束后,重启计算代码,然后RaiseDataColChanged方法重置列即可。

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


加好友 发短信 一级勋章 三级勋章 二级勋章
等级:超级版主 帖子:6318 积分:33951 威望:0 精华:10 注册:2008/8/31 20:56:00
  发帖心情 Post By:2009/8/5 1:34:00 [只看该作者]

有理。

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


加好友 发短信
等级:五尾狐 帖子:1037 积分:7428 威望:0 精华:0 注册:2008/8/31 22:52:00
  发帖心情 Post By:2009/8/5 8:38:00 [只看该作者]

老大的意思是:

计算代码还是写在datacolchanged 事件中,但是设置一个开关。

等数据填充完毕了以后,再打开这个开关,事件代码再一次性统一执行!

看来并不复杂啊!


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


加好友 发短信
等级:管理员 帖子:47477 积分:251256 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2009/8/5 8:41:00 [只看该作者]

是的.
以后加一些是否触发特定事件的逻辑属性算了.

 回到顶部
美女呀,离线,留言给我吧!
yangming
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信 一级勋章
等级:超级版主 帖子:4109 积分:23338 威望:0 精华:21 注册:2008/9/1 20:07:00
  发帖心情 Post By:2009/8/5 9:01:00 [只看该作者]

有理,学习了,如果以后能加特定属性最好

 回到顶部
总数 11 1 2 下一页