两个窗体传参的问题

问题描述

有两个窗体主窗体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

时间: 2024-09-21 23:59:56

两个窗体传参的问题的相关文章

c# winform 不同窗体之间datagridview 的传参

问题描述 两个不同窗体form1.form2两个窗体上分别有一个datagridview,假设为datagridview1和datagridview2如何将form1里datagridview1的内容通过按键传输到datagridview2?新手菜鸟一枚从未完整系统学习c#零零碎碎学习中求各位大神指点! 解决方案 解决方案二:1.公共变量2.委托解决方案三: 解决方案四:我都是偷懒.在Form2里面做一个共有变量.实例化的时候直接赋值.解决方案五:如果你能确定两个窗口全是在一个线程内打开(大部分

Silverlight实用窍门系列:37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)【附带实例源码】

在本节中将讲述Silverlight和ASP.NET页面的相互传参的两种常用方式:Cookie和QueryString.首先我们新建一个名为SLConnectASP.NET的Silverlight应用程序,然后在SLConnectASP.NET.web项目中添加一个Index.aspx的页面. 一.Silverlight和ASPX页面的QueryString传参 实现思路:在Silverlight端跳转到页面到Index.aspx并且传递一个QueryString参数ID,在该Index.asp

aspx页面Url传参在火狐浏览器下Page_Load执行两次的Bug

问题描述 机器环境:Xpsp3+Vs2010+Firefox28.0问题描述:新建一个空的Website,加入一个a.aspx和b.aspxa.aspx页面代码<%@PageLanguage="C#"AutoEventWireup="true"CodeFile="a.aspx.cs"Inherits="a"%><!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transi

ajax中data传参的两种方式分析

本文实例讲述了ajax中data传参的两种方式.分享给大家供大家参考,具体如下: 1. POST方式: /** * 订单取消 * @return {Boolean} 处理是否成功 */ function orderCancel(orderId, commant){ var flag = false; $.ajax({ type: "POST", url: "../order/orderCancel.action", //orderModifyStatus data:

ajax中data传参的两种方式分析_AJAX相关

本文实例讲述了ajax中data传参的两种方式.分享给大家供大家参考,具体如下: 1. POST方式: /** * 订单取消 * @return {Boolean} 处理是否成功 */ function orderCancel(orderId, commant){ var flag = false; $.ajax({ type: "POST", url: "../order/orderCancel.action", //orderModifyStatus data:

Javascript实例教程:点击传参方法和鼠标事件方法

文章简介:从这张开始就和大家说一些实用的效果的写法.当然首当其冲的就是我们可爱的TAB选项卡,用JQ写选项卡当然是很方便的而且方法也很多.其实用原生的JS写选项卡方法也很多. 从这张开始就和大家说一些实用的效果的写法.当然首当其冲的就是我们可爱的TAB选项卡,用JQ写选项卡当然是很方便的而且方法也很多.其实用原生的JS写选项卡方法也很多.下面我就写几个给大家看看一,点击传参方法<script>function tab(dom){var list = document.getElementByI

jsp页面传参乱码的解决方法

 本篇文章主要是对jsp页面传参乱码的解决方法进行了介绍,需要的朋友可以过来参考下,希望对大家有所帮助 jsp页面传参乱码的解决方法   jsp页面js:   encodeURIComponent要使用两次 encodeURIComponent(encodeURIComponent(userAccount));   java: String  userAccount = java.net.URLDecoder.decode(userAccount,"UTF-8");/*需要处理异常*/

jsp中文页面乱码与传参乱码

  页面乱码 这种乱码的原因是应为没有在页面里指定使用的字符集编码,解决方法:只要在页面开始地方用下面代码指定字符集编码即可 代码如下   <%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="err.jsp" %> 数据库乱码 这种乱码会使你插入数据库的中文变成乱码,或者读出显

各种语言执行入口的传参方法

在操作系统中,执行程序时可以由系统传入参数,就是在执行的时候,附带上参数.比如: 1 ping www.kryptosx.info 后面跟着的网址就是ping的参数. Linux和windows的shell都遵循这个参数传入方式.这里列一下各种语言的执行入口传参方法.主要分为两类,一种是有main函数的语言,一种是没有main函数的. 在执行命令的时候,linux系统会先对命令行进行分解.通常是以空格分解,如果有双引号,双引号内的也是认为是一个参数,无论里面有无空格. C类语言的执行入口传参: