C#中ComboBox的SelectedIndexChanged事件由于触发时间而引起的“未将对象引用到对象实例”错误解决
今天偶尔复习下WinForm开发,在用到ComboBox下拉框的时候,想用SelectedIndexChanged事件根据选中内容动态展示不同的数据,需求很简单,但是竟然出错了,后来发现其实就是SelectedIndexChanged事件执行时间问题导致的,那如何解决呢,请看下面的分析。
一、DataBind()方法就是给下拉框绑定的方法(这里为了让下拉框默认不选中,设置了SelectedIndex = -1)这个位置就是出问题的地方
//数据绑定private void DataBind(){//角色权限设置绑定下拉列表this.cboRoleList.DataSource = null;this.cboRoleList.DataSource = objAdminRole;this.cboRoleList.DisplayMember = "RoleName";this.cboRoleList.ValueMember = "RoleId";//去掉下拉列表的默认值this.cboRoleList.SelectedIndex = -1;}
二、这里触发了 SelectedIndexChanged事件,实现根据选中内容不同实现不同的切换(方法内部实现的啥可以不用关心)
//下拉列表改变时触发的事件private void cboRoleList_SelectedIndexChanged(object sender, EventArgs e){this.tvRightList.Nodes.Clear();List<FirstMenu> GetAllFirstMenuRoleId = objRightManager.GetAllFirstMenu(((AdminRole)(this.cboRoleList.SelectedItem)).RoleId);for (int i = 0; i < GetAllFirstMenuRoleId.Count; i++){TreeNode objNode = new TreeNode(){Name = GetAllFirstMenuRoleId[i].FirstMenuId.ToString(),Text=GetAllFirstMenuRoleId[i].DisplayName};List<SecondMenu> GetAllSecondMenuRoleId = objRightManager.GetAllSecondMenu(GetAllFirstMenuRoleId[i].FirstMenuId, ((AdminRole)(this.cboRoleList.SelectedItem)).RoleId);for (int j = 0; j < GetAllSecondMenuRoleId.Count; j++){objNode.Nodes.Add(new TreeNode() {Name= GetAllSecondMenuRoleId[j].SecondMenuId.ToString(),Text=GetAllSecondMenuRoleId[j].DisplayName,ForeColor=Color.Blue});List<RightList> GetAllRightListRoleId = objRightManager.GetAllRightList(GetAllSecondMenuRoleId[j].SecondMenuId, ((AdminRole)(this.cboRoleList.SelectedItem)).RoleId);for (int k = 0; k < GetAllRightListRoleId.Count; k++){objNode.Nodes[j].Nodes.Add(new TreeNode() {Name=GetAllRightListRoleId[k].RightId.ToString(),Text=GetAllRightListRoleId[k].RightName,ForeColor=Color.Red,Tag=GetAllRightListRoleId[k].RightCode});}}this.tvRightList.Nodes.Add(objNode);}//将整个节点展开this.tvRightList.ExpandAll();}
三、在这里定义了GetAllRoleRight()方法,这个方法本身在窗体初始化之后立即调用,方法内部是调用了上面的DataBind()方法。这时候就会出错,报的错误就是最常见的"未将对象引用到对象实例",
//绑定当前系统全部角色public void GetAllRoleRight(){ //为角色集合添加数据库全部角色objAdminRole =objRightManager.GetAllRole();//数据绑定DataBind(); }
错误原因:
SelectedIndexChanged事件是在绑定的时候就会触发,意思就是在设置SelectedIndex = -1的时候事件就已经被触发了,并立即调用步骤二中的事件响应方法cboRoleList_SelectedIndexChanged,而这时候,该方法第二行:List<FirstMenu> GetAllFirstMenuRoleId = objRightManager.GetAllFirstMenu(((AdminRole)(this.cboRoleList.SelectedItem)).RoleId);还没有来得及获得任何数据,故此时,程序会立即报错:未将对象引用到对象的实例。好了原因分析清楚了,那就说一下解决办法。
解决办法:手动断开/连接事件响应方法
在调用 DataBind()方法(设置SelectedIndex = -1)之前,即调用cboRoleList_SelectedIndexChanged()事件响应方法之前,断开事件与事件响应方法的关联,之后在调用后,再将事件与事件响应方法进行关联就好了。将方法三代码加两句(如下)
//绑定当前系统全部角色public void GetAllRoleRight(){//先将(下拉列表改变时触发的事件)事件解绑this.cboRoleList.SelectedIndexChanged -= new System.EventHandler(this.cboRoleList_SelectedIndexChanged);//为角色集合添加数据库全部角色objAdminRole =objRightManager.GetAllRole();//数据绑定DataBind();//再将(下拉列表改变时触发的事件)事件添加绑定this.cboRoleList.SelectedIndexChanged += new System.EventHandler(this.cboRoleList_SelectedIndexChanged);}
这样在调用 DataBind()方法(设置SelectedIndex = -1)(即调用cboRoleList_SelectedIndexChanged()事件响应方法)时候就不会触发SelectedIndexChanged事件。就不会报错了。
C#中ComboBox的SelectedIndexChanged事件由于触发时间而引起的“未将对象引用到对象实例”错误解决相关推荐
- C#中ComboBox的SelectedIndexChanged事件获取Tag值
DataTable table = new DataTable; /// <summary> /// 点击Cmb控件时获取Tag值 /// </sum ...
- 思维方式-《六顶思考帽》书中的精髓:通过在同一时间只使用一顶思考帽的方法,可以解决思维混乱等问题,从而提升思考效率。
<六顶思考帽>书中的精髓:通过在同一时间只使用一顶思考帽的方法,可以解决思维混乱等问题,从而提升思考效率. 日常工作生活中,我们常常会遇见这样的情况:会议又长又没重点.不同部门之间争执不停 ...
- android浏览器中 MUI 点击事件不触发的解决方法
在使用MUI框架的时候发现, onclick事件在电脑浏览器中可以正常触发, 但是在android浏览器上点击的时候, 出现了点击事件不触发的问题. 后来在网上找到了如下解决方法, 确实可以解决点击事 ...
- ASP.NET在.ashx文件中使用session出异常,未将对象引用到对象的实例
一.using System.Web.SessionState; 二.类实现IRequiresSessionState public class DoAjax : IHttpHandler,IRequ ...
- C# 调用ComboBox控件的SelectedIndexChanged事件
想要实现button按钮实现ComboBox的SelectedIndexChanged事件,网上搜索都是一些不被触发的问题,既然没人问,那应该是有些简单吧.问了懂得人最后终于写出来了. 实现方法: p ...
- android root点击事件,在Android中使用InputManagerService进行事件传递
在Android中使用InputManagerService进行事件传递 发布时间:2020-11-25 16:47:31 来源:亿速云 阅读:67 作者:Leah 在Android中使用InputM ...
- android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...
软件项目实训及课程设计指导--如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例 1.基于TCP/IP协议的Socket通信相关的基础知识 (1)TCP/IP(Transmissi ...
- ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法
转载:http://hi.baidu.com/haoyun2012/item/d780ca157a29b239b9318080 感谢原作者 ComboBox最经常使用的事件就是SelectedInde ...
- C# winform ComboBox绑定数据源时触发SelectedIndexChanged事件的处理
ComboBox二级联动时,发现一个问题.如下 var wardList = (from ward in alarmInfoListselect new{ward.AlarmJQ,ward.Alarm ...
最新文章
- android linearlayout 边框 圆角,如何将圆角半径应用于LinearLayout
- 2018 CVPR GAN 相关论文调研 (自己分了下类,附地址哦)
- YII2 Model 类切换数据库连接
- 019_html超链接
- 常用python模块
- 从输入流中获取数据并以字节数组返回
- NYOJ 904 search 二分查找
- 【职场】什么是 “职场PUA” ?
- 分析股票大数据_Python大数据分析量学祖师爷网站数据
- Linux命令之 -- export 设置/显示系统环境变量
- ubuntu12的程序问题
- Linux中sudo免密码
- 终端操作MySQL数据库
- linux服务器云防火墙配置文件,Linux云服务器防火墙配置之Firewalld
- 次氯酸:利用先天反应
- 使用 RabbitMQ 实现 RPC
- 格式工厂 wav 比特率_这可能是 Mac 上最强格式转换工具
- C++语言课程设计——超市商品管理系统
- body英语什么意思是什么_body是什么意思
- 如何基于微信开放接口开发企业的微信 CRM?
热门文章
- js中的eq和get是什么意思
- 《Effective Java》阅读笔记(二)
- Mysql如何快速制造千万级上亿条数据?
- asterisk 连接可达网络电话callda
- @Scheduled源码解析
- echart柱状图Y轴最小间隔问题,Y轴不显示小数
- 按照年龄划分,60及以上是老年人,40-60是中年人,20-40青年人,10-20青少年,10岁以下儿童
- ​通达信量比捉牛股指标源码​_通达信公式
- CSS-background背景详解
- 从柴静的片子谈人力资源需求的趋势