Foxtable(狐表)用户栏目专家坐堂 → 建议:建议把DatacolChanged事件变得智能一些!


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

主题:建议:建议把DatacolChanged事件变得智能一些!

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


加好友 发短信
等级:小狐 帖子:363 积分:2998 威望:0 精华:0 注册:2008/11/11 13:42:00
  发帖心情 Post By:2009/6/14 10:51:00 [只看该作者]

比较专业,还不太懂啊!


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


加好友 发短信
等级:一尾狐 帖子:485 积分:3926 威望:0 精华:6 注册:2009/3/29 13:25:00
  发帖心情 Post By:2009/6/14 17:24:00 [只看该作者]

我以前做excel vba的时候,就用到过一个事件,
就是当选择特定单元格时,执行代码.
但是效率很低.每一次的选择都要进行判断,单元格的位置是否正确.然后执行代码.
我个人认为,列的事件.如果有,那么效率会更高些.
最起码,在选择无关列时,不会执行代码.提升些效率.
毕竟不执行代码是最快的.


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/6/15 9:18:00 [只看该作者]

    我不主张增加列事件,在这一点上我同意贺老师的观点,如果增加列事件会使代码变更大常分散,不好管理.所以,以前的计算代码取消了,也并无不妥.  但是,其实计算代码与Datacolchanged事件中的代码相比,有一个实质性的区别.那就是计算代码完全是按变化最终影响的结果列进行组织的,而Datacolchanged事件中的条件却完全是按变化的来源列进行组织的.

     如果从计算机处理的角度来看,当然是按变化的来源列组织更为高效/方便处理,但如果从用户使用方便/容错的角度,按变化影响的结果列进行组织却更方便编程,而且不容易出错.所以,在很多时候,我很留恋以前的列计算代码,但以前的列计算代码确实太分散不易管理.我正是分析了以前的列计算代码,所以,我才认为把列计算关系的代码按变化影响的结果列进行组织应该完全是可能的(因为以前的列计算代码就是这么组织的,这已经实现了).

    对于简单的计算关系,按来源列进行组织和按结果列进行组织并无多大的区别,但对于计算关系非常复杂的事件代码,两者是有明显区别的. 一般情况下,结果列数量少,而且一目了然,很容易编码;引起变化的列却非常多,写编码时容易漏掉(我就曾不止一次的漏掉条件列).

     如果更改系统现有的Datacolchanged事件有难度,看能否这样解决.再增加一个表事件,介于以前的列计算代码与Datacolchanged事件之间,与以前的计算代码的区别在于它是一个表事件,一个表的所有代码都组织在一起;与Datacolchanged事件的区别在于,对代码不按引起变化的列进行组织,而改为按变化影响的结果列进行组织.

    增加这个事件,可能对大部分人意义并不大,但也没有不利的影响.但对于计算关系非常复杂的表代码来说,却可以提高编码效率,而且大大降低容错性.  如果表中的计算关系只有 M=A+B+C+D 这么简单,那么我的建议纯属浪费时间,但如果您认真分析一些非常复杂的计算关系,就会感觉到这两点有多大的区别了.

[此贴子已经被作者于2009-6-15 9:19:54编辑过]

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


加好友 发短信
等级:婴狐 帖子:82 积分:1202 威望:0 精华:0 注册:2008/9/1 17:51:00
  发帖心情 Post By:2009/6/15 11:53:00 [只看该作者]

以下是引用狐狸爸爸在2009-6-14 10:31:00的发言:


呵呵,我也考虑过列事件,但是决大多数时候,列事件只是将代码搞得更为复杂,例如金额由数量、单价、折扣计算得出,那么同样的代码要设置在数量、单价、折扣三列的事件中,显然用表事件更为合理:

Select e.DataCol.Name
   Case "数量","单价","金额"
       e.DataRow("金额") = .....
   Case  "列1","列2"
      e.DataRow("列3") = ...
   Case  "例5"
      e.DataRow.Locked = True
End Select

这样不仅条理清晰,而且便于维护,这也是为什么最初的针对列的计算代码被删除的原因。

[此贴子已经被作者于2009-6-14 10:34:26编辑过]

     你举的这个多列计算的例子确实是用表事件比较方便。但是,当某一列数据发生改变时,需要对数据表、数据列进行比较复杂的处理时,用列事件来处理是比较合适的(就像易表的操作公式一样),虽然系统提供了DataColChanged、PrepareEditValidateEdit、AfterEdit等表事件,但执行效率不如列事件高,并且必须在事件中判断变化的列。例如用PrepareEdit表事件动态设置列表项目,当每次进入该单元格的时侯即便是列表项目没有变化都要触发执行一次事件代码,在这种情况下在列事件中动态设置项目列表的代码要合适一些。
    我觉得表事件和列事件有时是不能互相取代的,两者共存,各取所需,这也是目前编程比较通行的做法。完全用表事件代替列事件,把表事件搞得太多太复杂了,这对于初学者来说是不利的。另外,表事件比列事件触发执行的频率要高得多,能在列事件中处理的还是应该尽量放在列事件中。事件驱动的程序追求的就是把代码放在不同的事件中来执行,以便于提高执行效率。仅供老六参考!

[此贴子已经被作者于2009-6-15 14:44:13编辑过]

 回到顶部
总数 24 上一页 1 2 3