Foxtable(狐表)用户栏目专家坐堂 → 对窗口中输入框的ValueChanged事件及输入框的其他事件的分析与讨论!


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

主题:对窗口中输入框的ValueChanged事件及输入框的其他事件的分析与讨论!

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
对窗口中输入框的ValueChanged事件及输入框的其他事件的分析与讨论!  发帖心情 Post By:2009/2/7 9:17:00 [显示全部帖子]

     我在一个子窗口中插入一个页面集合(TabControl)控件,在每个页面中有若干个标签和若干个输入框,每个输入框都绑定一个全局变量。但是,当我在页面集合中切换页面的时候,会自动激发某个输入框的ValueChenged事件,而且不是激发所有输入框的ValueChenged事件,而是某一个(具体哪一个,我没有找到规律)。昨天我试了半夜也没有查出原因,估计是FoxTable系统的问题了。在正常情况下,输入框应该显示全局变量的初始值,切换页面不应激发ValueChenged事件,希望贺老师认真检查一下!


 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:管理项目5.table

[此贴子已经被作者于2009-2-10 15:36:38编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/7 13:45:00 [显示全部帖子]

以下是引用程兴刚在2009-2-7 13:41:00的发言:

这并不是bug!

不是bug,那是什么?
在切换页面的时候,应显示变量的初始值,而不应运行ValueChanged事件啊!这难道不是系统的错误吗?


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/7 16:08:00 [显示全部帖子]

以下是引用程兴刚在2009-2-7 15:01:00的发言:

      因为ValueChanged事件是在数据变化后执行,您的文字框控件又和全局变量进行了绑定,当点击页面,加入到页面中的控件的初始值为空,由于绑定过程的生效,把全局变量的值赋给了这个控件,该控件的值发生了变化,ValueChanged事件开始执行(此时应该执行,否则,就真是bug了),此次执行以后,全局变量的值和控件的值不再发生变化,所以就不再继续执行,
由此可见,绑定后的文字框控件(包括其他类似控件)不能在ValueChanged事件执行代码(可以把代码改写到其他事件中,或者增加判断条件,判断某一个全局变量的值来实现,这样只有某一个全局变量的值符合要求,该事件的判断条件成立,则执行您需要执行的代码即可),相反,未绑定则可以执行ValueChanged事件!

[此贴子已经被作者于2009-2-7 15:03:54编辑过]

   道理可以理解。但是,这的确不符合实际的需要!
   程老师说可以把代码改写到其他事件中,那么,写在ValueChanged事件中的代码,好像改在哪儿都不合适啊!所以,个人意见还是,改进系统,自动作判断,若是由于绑定过程的生效造成控件的值由nothing变为全局变量的值,则不运行ValueChanged事件中的代码,而只有在真正的控件的值改变时,再运行这个代码。
    另外,根据程老师的建议,在每个控件的ValueChanged事件中都加一个判断是可以解决问题,但是,与其在页面集合中的每个控件的ValueChanged事件中都人为的加一个判断,为什么不改进一下系统,让系统自动来判断,这样岂不是更省事吗?软件应该以人为本,以需求为导向!软件目前这样设计,在切换页面时自动运行ValueChanged事件,好像既没有任何实际用途,又会给使用者带来麻烦,为什么不改进一下呢?希望老师们能够理解和支持!

[此贴子已经被作者于2009-2-7 16:30:11编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 0:02:00 [显示全部帖子]

以下是引用程兴刚在2009-2-7 15:01:00的发言:

      因为ValueChanged事件是在数据变化后执行,您的文字框控件又和全局变量进行了绑定,当点击页面,加入到页面中的控件的初始值为空,由于绑定过程的生效,把全局变量的值赋给了这个控件,该控件的值发生了变化,ValueChanged事件开始执行(此时应该执行,否则,就真是bug了),此次执行以后,全局变量的值和控件的值不再发生变化,所以就不再继续执行
由此可见,绑定后的文字框控件(包括其他类似控件)不能在ValueChanged事件执行代码(可以把代码改写到其他事件中,或者增加判断条件,判断某一个全局变量的值来实现,这样只有某一个全局变量的值符合要求,该事件的判断条件成立,则执行您需要执行的代码即可),相反,未绑定则可以执行ValueChanged事件!

[此贴子已经被作者于2009-2-7 15:03:54编辑过]

   如果真的是这样,那么在窗口中的输入框将无法再使用ValueChanged事件了(因为窗口中的输入框一般情况下都要绑定全局变量或者字段)。但在实际应用中,窗口事件中可能使用频率最多的就是ValueChanged事件了。如果对于每个ValueChanged事件还要用户自己加一些判断语句,真的是太不方便了,会大大的影响设计效率,这岂不违背了FoxTable的设计效率高使用简便的宗旨了吗?再者换个角度来说,既然用户在使用ValueChanged 事件时另外加个全局变量作个判断就可以解决问题,那么在系统中自动作这个判断应该也是很简单的事情,怎么会难度不小呢?
   而且在测试过程中,发现有的输入框却能正常的显示出全局变量的值,而另一些不能正常显示出全局变量的值,不知是怎么回事,搞得有些莫名奇妙。其实,我认为解决这个问题应该是有办法的,系统应该在打开窗口时或者切换页面时,这时候每个控件都需要从全局变量或者字段取值,这时候不需要执行ValueChanged事件,而只在窗口或页面中的控件已经从全局变量或者字段首次取值后,如果再发生变化,再激活ValueChanged事件。总之,我认为,软件应该是以人为本,以实际需要、以使用方便为目标,而不是麻烦不麻烦。所以,希望贺老师重视此问题,尽快改进!因为我的系统设计了一半,只能等程序改进后再继续了!
   

[此贴子已经被作者于2009-2-8 10:25:42编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 11:43:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-2-8 11:21:00的发言:
这个问题牵涉很多,微软的.net就是这么触发事件的,问题比较复杂,改与不改都有负面的影响.
也许加一个新的事件,在某个全局变量的值发生变化后触发,会计较合理。

盼星星盼月亮,老大终于出现了!
     贺老师说改与不改都有负面的影响,但我从应用的角度,还没有考虑出改了有什么负面的影响,个人感觉改了使用起来会更方便!至于微软的.net就是这么触发事件的,这并不影响狐表中进行改进啊!如果狐表不能使用更方便、设计效率更高,那就没有做这个软件的必要了!
    如果贺老师说保留原事件增加一个新事件,那就增加一个只在控件的值真正发生变化而在控件从全局变量或字段取值不触发的事件吧!至于增加一个全局变量的值发生变化的事件,好像也有必要,会在设计的时候加快效率,更方便!但这并不能完全代替控件的ValueChanged事件,两者各有用途!

[此贴子已经被作者于2009-2-8 11:45:50编辑过]

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 12:03:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-2-8 11:49:00的发言:

按照我的开发经验,微软这样处理是有道理的。
例如,只要某个控件的内容发生变化,就执行某些代码,而不管什么原因导致这个控件的内容发生变化。

至少我自己开发的时候,相当多的时候是希望这样的。

所以还是增加一个事件较为合理。

     增加一个事件当然可以解决问题,也不妨碍以前的设计,只是希望快一点!但我还是希望增加一个针对控件值变动的控件(如果用变量改变的控件来代替,虽然可以实现,但很不方便)。
     另外,作为目前软件的解决方案,请教一下贺老师。用什么办法在打开窗口时或者切换页时不执行ValueChanged事件比较好呢?如果按照程版主的办法,设置一个全局全量,按照它的值为True还是False作为判断条件,那么应在什么事件的什么情况下(也就是在什么事件中,用什么代码)来改变这个作为判断条件的全局变量的值呢?


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 12:43:00 [显示全部帖子]

我还想问一下,当窗口中有页面集合时,是在打开窗口时对所有页面中的输入框从全局变量取值,还是只对打开的当前页面的输入框从全局变量取值?

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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 13:54:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-2-8 12:10:00的发言:
如果有一个事件是在全局变量的值发生变化后才执行,那么你根本就没有必要中这个ValueChanged事件了。
其余的解决办法,我暂时没有时间深入,请大家自行探讨。

    虽然贺老师很忙,但还是希望贺老师要抽出时间来探讨这个问题,我试了很多办法,都不太理想(或者过于麻烦)!因为这关系到要不要改进foxtable软件的问题,如果贺老师不能提供一个很好的解决方案,或者解决方案比较复杂、影响效率的话,我们只能寄希望于贺老师通过改进FOXTable本身来解决!其他人都是无能为力的!如果贺老师能够提供一个很简便的解决方案,不改进软件也就无关紧要了。而且,这不是一个个性的问题,在打开窗口或者切换页面时,如何屏蔽掉输入框的ValueChanged事件,这应该是一个非常普遍的共性问题!所以希望贺老师抽出一些宝贵时间来关注这个问题!期待ing!


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 14:54:00 [显示全部帖子]

以下是引用狐狸爸爸在2009-2-8 14:50:00的发言:
我前面不是说了通过增加一个事件来解决吗?
1、要某个控件的内容发生变化,就执行某些代码,而不管什么原因导致这个控件的内容发生变化,那么就用Valuechanged事件。
2、如果只要某个全局变量的值真正发生变化后执行,就用新的事件。

根据需要选择即可。

好的,那我等着吧,谢谢!


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


加好友 发短信 一级勋章
等级:六尾狐 帖子:1412 积分:8937 威望:0 精华:0 注册:2008/9/1 8:57:00
  发帖心情 Post By:2009/2/8 15:26:00 [显示全部帖子]

我考虑了一个解决方案,假如输入框("NumericComboBox1")与全局变量vars("a1")绑定,我把输入框的ValueChanged事件改为:
   if e.Form.Controls("NumericComboBox1").value=vars("a1")
       return
   end if
   messagebox.show("激发了NumericComboBox1的ValueChanged事件!")

   (ValueChanged代码段……)

    不知贺老师所说的增加一个全局变量值改变的事件,原理是否与此类似?当然了,能增加一个事件更好,更方便快捷了!
   不知这样是否会存在这样一个问题?虽然输入框和全局变进行了绑定,但全局变量的改变不一定是在输入框中,即全局变量的值可能在其他地方(如其他事件中)进行了改变,不知会不会对这个事件造成什么影响?

   另外,对输入框的事件提两点建议:
(1)与列的Datacolchanging类似,输入框也需要一个这个的Valuechanging事件,以实现在输入框的内容变化前执行,对输入框的内容的合理性进行验证,并拦截不合理的情况,取消变化(这个事件与Valuechanged事件和Validating事件有本质的区别,前者是在变化前执行,后两者是在变化后执行).
(2)对ValueChanged事件和ValueChanging事件各增加一个E参数,以取得变化前的值,目前的E参数只能取得变化后的值,在很多时候需要变化前的值。
     总之,个人一直感觉贺老师对表本身的事件非常重视,一直对窗口功能(包括窗口中的事件)重视不够,希望贺老师能够重视窗口功能部分的增强,把窗口中的事件也能像表事件那样功能强大!就个人意见而言,认为窗口控件的事件与表事件同等重要!根据我个人的习惯,因为考虑到最终用户的易操作性和数据安全性问题,我设计应用系统时基本上把所有的数据计算、数据验证都放在了窗口控件(往往是输入框)的事件中,而表事件很少用到。
     因为一般在应用系统中,编辑通过窗口进行更为安全。在大部分的管理软件中,通常在窗口中编辑数据的时候,并不直接修改表中的数据,而是只修改全局变量的值,而窗口中往往有两个按钮“保存”和“取消”,如果在窗口中编辑后点“保存”按钮,再把全局变量的值写到表中;而如果点“取消”按钮,就不再把全局变量的值写到表中。而如果直接编辑表,一旦修改就直接保存在表中,很难取消了。
[此贴子已经被作者于2009-2-8 18:10:27编辑过]

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