Foxtable(狐表)用户栏目专家坐堂 → [求助]在表事件中修改了表中另外一列的值,是否会再次引发该事件?


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

主题:[求助]在表事件中修改了表中另外一列的值,是否会再次引发该事件?

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


加好友 发短信
等级:婴狐 帖子:27 积分:258 威望:0 精华:0 注册:2011/3/24 19:38:00
[求助]在表事件中修改了表中另外一列的值,是否会再次引发该事件?  发帖心情 Post By:2011/3/30 13:12:00 [只看该作者]

[求助]在表DataColChanged事件中修改了表中另外一列的值,是否会再次引发该事件?

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


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

如果不加以判断肯定会。

具体可参考:http://help.foxtable.com/topics/0625.htm

 


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


加好友 发短信
等级:管理员 帖子:47449 积分:251065 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/3/30 13:55:00 [只看该作者]

除了C版说的,楼主再看看这个:

 

http://help.foxtable.com/topics/1522.htm

 


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


加好友 发短信
等级:婴狐 帖子:27 积分:258 威望:0 精华:0 注册:2011/3/24 19:38:00
  发帖心情 Post By:2011/3/30 14:39:00 [只看该作者]

这是帮助文件中的说明,仍存在疑问,见后面.

 

一定要判断列名!

不少人,特别是初学编程的人,没有在DataColChanged事件中判断列名的习惯,例如为了在订单表计算金额,往往只是在DataColChanged简单地写入代码:

Dim dr As DataRow = e.DataRow
dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))

这样可能会带来严重的后果,首先会导致重复的计算,因为数量、单价或折扣发生变化后,触发DataColChanged事件,计算得出新的金额,而金额列内容的变化,会再次触发DataColChanged事件,使得金额被重新计算一次;实际上其他不相关列,例如日期、客户、产品等列内容发生变化后,同样会触发DataColChanged事件,导致金额列被重新计算。

显然这样的代码,效率实在是太低,而且在机缘巧合的情况下,很可能会出现死循环,导致程序崩溃。

所以我们一定要养成良好的习惯,在编写DataColChanged事件代码时,判断发生变化列的名称,只有相关列发生变化时,才进行特定的重算工作。

例如:

Dim dr As DataRow = e.DataRow
Select
Case e.DataCol.Name
   
Case "数量","单价","折扣"
        dr(
"金额") = dr("数量") * dr("单价") * (1 - dr("折扣"))
End
Select

这节的内容不仅仅针对DataColChanged,实际上对于任何表事件都有效,例如DataColChaning、PrepareEdit、ValidateEdit、AfterEdit等等。

 

 

---------

请问版主:

 

我对狐表中"事件"的引发机制做了测试,有如下猜测:

1.如果Col值发生"赋值操作"(可以是赋值,编辑等等引发),狐表中首先判断新值是否与原值相等,如果不相等则引发DataColChanged事件.

2.对Col值的赋值操作将立即引发对"第1条原则"的判定过程,并递归调用下去,直至第1条条件不成立.

 

请版主确认

-----------

按照事件的引发机制,如果遇到数据表中各记录存在循环引用的逻辑关系时,会引发无穷递归,狐表将崩溃.


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


加好友 发短信
等级:管理员 帖子:47449 积分:251065 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2011/3/30 14:42:00 [只看该作者]

呵呵,你非常细心,你的理解正确,帮助这里说的不够精准,确实只有列的内容发生变化,才会触发DataColChanged事件.

 回到顶部