以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  对窗口中输入框的ValueChanged事件及输入框的其他事件的分析与讨论!  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=1759)

--  作者:cpayinyuan
--  发布时间:2009/2/7 9:17:00
--  对窗口中输入框的ValueChanged事件及输入框的其他事件的分析与讨论!

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


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

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

--  作者:菜鸟foxtable
--  发布时间:2009/2/7 12:48:00
--  
的确如此啊...怪事了.全局变量全变成20......


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


--  作者:程兴刚
--  发布时间:2009/2/7 13:41:00
--  

这并不是bug!


--  作者:cpayinyuan
--  发布时间:2009/2/7 13:45:00
--  
以下是引用程兴刚在2009-2-7 13:41:00的发言:

这并不是bug!

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


--  作者:程兴刚
--  发布时间:2009/2/7 15:01:00
--  

      因为ValueChanged事件是在数据变化后执行,您的文字框控件又和全局变量进行了绑定,当点击页面,加入到页面中的控件的初始值为空,由于绑定过程的生效,把全局变量的值赋给了这个控件,该控件的值发生了变化,ValueChanged事件开始执行(此时应该执行,否则,就真是bug了),此次执行以后,全局变量的值和控件的值不再发生变化,所以就不再继续执行,如果您把其中一个变量的赋值公式变成这样:

Vars("a1") = Vars("a1")+1

当您点击页面的时候,该控件的值一直要不断递增下去,直到关闭窗口或死机(没有测试,这是原理,您可以试验一下)

由此可见,绑定后的文字框控件(包括其他类似控件)不能在ValueChanged事件执行代码(可以把代码改写到其他事件中,或者增加判断条件,判断某一个全局变量的值来实现,这样只有某一个全局变量的值符合要求,该事件的判断条件成立,则执行您需要执行的代码即可),相反,未绑定则可以执行ValueChanged事件!

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

--  作者:cpayinyuan
--  发布时间: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编辑过]

--  作者:舜风
--  发布时间:2009/2/7 16:22:00
--  
6楼说的好似有道理
--  作者:程兴刚
--  发布时间:2009/2/7 17:36:00
--  

呵呵,能改成全自动化才是好事,估计难度不小,不仅仅是这几个控件、还有表的单元格等所有涉及到ValueChanged事件的地方,都要改,而且,其值在什么情况下才算真正改变?nothing变为其他值不算真正变化的话,这种时候应该很多了,比如,起动系统,切换面板之前没有给变量赋值(看看能不能采用其他事件晚些给全局变量赋值,这样不知道行不行,没有细看您的文件),而是进入窗口的面板通过其他方法赋值产生的改变,也有从空值(nothing)变为其他值的过程,这样,又会出现新的问题,估计还是需要通过变通(其实也不叫变通,编程增加判断是很正常的事),仅代表个人观点,贺老师决定吧,本人不再议!


--  作者:cpayinyuan
--  发布时间: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编辑过]

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