问题描述
有两个窗体主窗体A和子窗体B我在窗体B中添加了对主窗体类型变量,并在实例化窗体B时,对B窗体中的主窗体类型变量进行赋值,代码大概如下:publicclassA:Window{inti;CollectionViewSourcecvs_Menulist;A(){this.InitializeComponent();i=0;cvs_Menulist=//实例化代码省略}privatecvs_Menulist(objectsender,FilterEventArgse){//省略}publicvoidAFunc(){//变量自增i++;//这句大概就是给cvs_Menulist添加过滤条件this.cvs_Menulist.Filter+=newFilterEventHandler(cvs_Menulist);}}//B窗体的代码publicclassB:Window{privateA_a;//这个是对窗体A类型的引用publicB(Aa){this._a=a;}publicvoidBFunc(){this._a.AFunc();}}
是这样的,我在窗体A中的一个Button的Click事件代码中写newB(this).ShowDialog();
然后在点击窗体B的Closing事件中调用窗体B的BFunc()方法,vs报错“System.NullReferenceException”类型的未经处理的异常出现在PresentationFramework.dll中。其他信息:未将对象引用设置到对象的实例。如果把添加过滤条件的代码注释掉,程序没问题,所以估计应该是这句代码的问题this.cvs_Menulist.Filter+=newFilterEventHandler(cvs_Menulist);关于委托的东西不太懂,求大神指点问题出在哪了PS:关于WPF的实现了INotifyPropertyChanged接口绑定的数据源属性的改变可以通知给UI,但是为什么不能通知CollectionViewSource的Filter呢,每次更改数据源都要重新调用这句this.cvs_Menulist.Filter+=newFilterEventHandler(cvs_Menulist);,有没有跟好的方法?
解决方案
本帖最后由 helloallo 于 2015-04-29 22:28:32 编辑
解决方案二:
你可以在你的cvs_Menulist=//实例化代码省略这里设置断点,然后执行你的程序。看看这行代码在出现bug之前到底有没有执行。
解决方案三:
遇到“未将对象引用设置到对象的实例“这种异常(其实任何其它异常也是一样啦),都要先调试,等vs的调试器确实地停在抛出异常的语句上,你要调试具体的变量(甚至调用堆栈里不同的方法调用入口的变量)。不能仅凭“如果把添加过滤条件的代码注释掉,程序没问题,所以估计应该是这句代码的问题”这类回答。这类回答并没有把调试操作做到位。
解决方案四:
http://bbs.csdn.net/topics/360140208
解决方案五:
引用1楼sp1234的回复:
你可以在你的cvs_Menulist=//实例化代码省略这里设置断点,然后执行你的程序。看看这行代码在出现bug之前到底有没有执行。
问题出来了,voidcvs_MyMenulist_Filter(objectsender,FilterEventArgse){DC_CLIENT.Menumenu=e.ItemasDC_CLIENT.Menu;if(menu!=null)//*************添加的代码**********************{if(menu.Count>0){e.Accepted=true;}else{e.Accepted=false;}}}
在注册Filter事件添加了判断条件,如上面代码所示,在窗体A中注册改事件没问题,在窗体B中通过调用BFunc()方法,注册该事件就有问题,对事件函数中的参数不太理解,比如Button的Click事件objectsender代表触发的按钮控件,e代表传入的参数,sender和e是不是事件触发时.net中某种机制进行赋值的?是不是可以这么理解当调用Bfunc()时没有对e参数进行赋值,或者对e参数所赋的值不能转换为Menu类型?唯一的区别就是在A中调用AFunc函数和在B中调用BFunc函数,是不是问题出在这里
解决方案六:
引用1楼sp1234的回复:
你可以在你的cvs_Menulist=//实例化代码省略这里设置断点,然后执行你的程序。看看这行代码在出现bug之前到底有没有执行。
调试时只会跳转到newB(this).ShowDialog()这句
解决方案七:
引用2楼sp1234的回复:
遇到“未将对象引用设置到对象的实例“这种异常(其实任何其它异常也是一样啦),都要先调试,等vs的调试器确实地停在抛出异常的语句上,你要调试具体的变量(甚至调用堆栈里不同的方法调用入口的变量)。不能仅凭“如果把添加过滤条件的代码注释掉,程序没问题,所以估计应该是这句代码的问题”这类回答。这类回答并没有把调试操作做到位。
刚才调试了一遍,在A中调用该方法,正常情况下传入的sender为CollectionViewSource类型,在B中调用传入的是个Button类型,而这个Button就是在该Button的Click事件里写NewB(this).ShowDialog();的button