问题描述
有一窗体,上有一数据源,与若干控件,当控件与数据源进行绑定时,会触发ValueChanged事件,但我想在数据绑定时不触发该事件,而只在手动改变控件值时才触发该事件。我的想法是在数据绑定前暂时挂起控件的事件,但不知如何处理,或有更好的方法。
解决方案
解决方案二:
绑定前,不要添加该事件(设计阶段去除该控件的该事件),在绑定之后,添加该事件的委托到控件中。如控件的事件假设为:privatevoid控件_ValueChanged(.....){//控件事件}在绑定之后执行如下代码:控件.ValueChanged+=new该事件的委托(控件_ValueChanged);如果不知道事件的委托是什么,可以先在设计阶段添加该事件,然后打开当前类的.Designer.cs文件,从中找到这个控件的关于添加事件委托的代码,然后把该代码复制到绑定之后中,最后删除该事件即可。
解决方案三:
此方法不适用:1、数据绑定通过编程方法实现,目的是为了多次更改绑定,难不成也多次添加该事件的委托?2、就按该方法,我做过测试,还是会触发该事件,以下是测试的代码片断(先绑定,后添加委托),在Designer.cs无ValueChanged的重复委托。numericUpDown1.DataBindings.Add("Value",_rGZSC,"XSZS");numericUpDown1.ValueChanged+=newSystem.EventHandler(ValueChanged);voidValueChanged(objectsender,EventArgse){DataChanged(this,newEventArgs());}
解决方案四:
我认为应该在ValueChanged里面写上if(!控件.Focused)return;当然我的写法是比较投机取巧,楼主可根据自己的实际情况而定
解决方案五:
顶顶顶
解决方案六:
设一个全局布尔变量,初始值设为false,在ValueChanged事件代码中加上判断。privateboolIfBounded=false;voidValueChanged(objectsender,EventArgse){if(!IfBounded)return;DataChanged(this,newEventArgs());}在重新绑定之前,设为false,绑定完之后设为true,不知道这种方法可不可行。privatevoidbounddata(){IfBounded=false;绑定数据源....IfBounded=true;}
解决方案七:
用最笨最简单的方法,搞那么复杂干嘛
解决方案八:
-=ValueChanged数据绑定+=ValueChanged不就行了
解决方案九:
同意5楼的方法
解决方案十:
回复5楼:bounddata与ValueChanged是在同一线程中,只有当bounddata执行完后才会触发ValueChanged事件,所以IfBounded的值永远是true,该方法除非用多线程实现。但多线程编程的工作量太大,而且控制比较困难。我记得以前好像用过一个方法,可以在控件或数据加载时,暂停控件的事件触发,只是想不起用什么方法了,或是VB中有该功能,或者说这个记忆就是错的。回复3楼:你的方法,粗一想,行不通;但细想也对,当手动更改控件值时,该控件是有焦点的。不过,如果2个控件是有连带关系,当手动修改其中一控件,而带动另一控件的值时,那将无法获得正确的结果。
解决方案十一:
触发一个事件时应该是打开一个新的线程的,我做了一个简单的例子:privatevoidbutton1_click(objectsender,EventArgse){textbox1.text="aaa";Console.WriteLine("button1_click");}privatevoidtextbox1_textchanged(objectsender,EventArgse){Console.WriteLine("textbox1_textchanged");}我在点击button1时,输出的结果是:textbox1_textchangedbutton1_click也就是说在给textbox1赋值时先触发了textchanged事件,然后继续下面的代码,不知我这样的解释合理不?
解决方案十二:
textBox1.TextChanged-=textBox1_TextChanged;这里实现数据的绑定。textBox1.TextChanged+=textBox1_TextChanged;我测试过了,不会触发事件
解决方案十三:
感谢各位对该帖的关注,特别感谢tao77对问题的认真负责。虽然“暂时挂起控件的事件”的这个目标没实现,但通过大家的热心帮助使我解决了这个问题。