今天偶尔复习下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事件由于触发时间而引起的“未将对象引用到对象实例”错误解决相关推荐

  1. C#中ComboBox的SelectedIndexChanged事件获取Tag值

    DataTable table = new DataTable; /// <summary>         /// 点击Cmb控件时获取Tag值         /// </sum ...

  2. 思维方式-《六顶思考帽》书中的精髓:通过在同一时间只使用一顶思考帽的方法,可以解决思维混乱等问题,从而提升思考效率。

    <六顶思考帽>书中的精髓:通过在同一时间只使用一顶思考帽的方法,可以解决思维混乱等问题,从而提升思考效率. 日常工作生活中,我们常常会遇见这样的情况:会议又长又没重点.不同部门之间争执不停 ...

  3. android浏览器中 MUI 点击事件不触发的解决方法

    在使用MUI框架的时候发现, onclick事件在电脑浏览器中可以正常触发, 但是在android浏览器上点击的时候, 出现了点击事件不触发的问题. 后来在网上找到了如下解决方法, 确实可以解决点击事 ...

  4. ASP.NET在.ashx文件中使用session出异常,未将对象引用到对象的实例

    一.using System.Web.SessionState; 二.类实现IRequiresSessionState public class DoAjax : IHttpHandler,IRequ ...

  5. C# 调用ComboBox控件的SelectedIndexChanged事件

    想要实现button按钮实现ComboBox的SelectedIndexChanged事件,网上搜索都是一些不被触发的问题,既然没人问,那应该是有些简单吧.问了懂得人最后终于写出来了. 实现方法: p ...

  6. android root点击事件,在Android中使用InputManagerService进行事件传递

    在Android中使用InputManagerService进行事件传递 发布时间:2020-11-25 16:47:31 来源:亿速云 阅读:67 作者:Leah 在Android中使用InputM ...

  7. android socket 发送byte_如何正确地创建和销毁网络通讯程序中的Socket类的对象实例...

    软件项目实训及课程设计指导--如何正确地创建和销毁软件应用系统中网络通讯中的Socket类的对象实例 1.基于TCP/IP协议的Socket通信相关的基础知识 (1)TCP/IP(Transmissi ...

  8. ComboBox绑定数据源时触发SelectedIndexChanged事件的处理办法

    转载:http://hi.baidu.com/haoyun2012/item/d780ca157a29b239b9318080 感谢原作者 ComboBox最经常使用的事件就是SelectedInde ...

  9. C# winform ComboBox绑定数据源时触发SelectedIndexChanged事件的处理

    ComboBox二级联动时,发现一个问题.如下 var wardList = (from ward in alarmInfoListselect new{ward.AlarmJQ,ward.Alarm ...

最新文章

  1. android linearlayout 边框 圆角,如何将圆角半径应用于LinearLayout
  2. 2018 CVPR GAN 相关论文调研 (自己分了下类,附地址哦)
  3. YII2 Model 类切换数据库连接
  4. 019_html超链接
  5. 常用python模块
  6. 从输入流中获取数据并以字节数组返回
  7. NYOJ 904 search 二分查找
  8. 【职场】什么是 “职场PUA” ?
  9. 分析股票大数据_Python大数据分析量学祖师爷网站数据
  10. Linux命令之 -- export 设置/显示系统环境变量
  11. ubuntu12的程序问题
  12. Linux中sudo免密码
  13. 终端操作MySQL数据库
  14. linux服务器云防火墙配置文件,Linux云服务器防火墙配置之Firewalld
  15. 次氯酸:利用先天反应
  16. 使用 RabbitMQ 实现 RPC
  17. 格式工厂 wav 比特率_这可能是 Mac 上最强格式转换工具
  18. C++语言课程设计——超市商品管理系统
  19. body英语什么意思是什么_body是什么意思
  20. 如何基于微信开放接口开发企业的微信 CRM?

热门文章

  1. js中的eq和get是什么意思
  2. 《Effective Java》阅读笔记(二)
  3. Mysql如何快速制造千万级上亿条数据?
  4. asterisk 连接可达网络电话callda
  5. @Scheduled源码解析
  6. echart柱状图Y轴最小间隔问题,Y轴不显示小数
  7. 按照年龄划分,60及以上是老年人,40-60是中年人,20-40青年人,10-20青少年,10岁以下儿童
  8. ​通达信量比捉牛股指标源码​_通达信公式
  9. CSS-background背景详解
  10. 从柴静的片子谈人力资源需求的趋势