none
程序关闭时,引发NullReferenceException异常 RRS feed

  • 问题

  • private void listBox_客户信息_客户名单_SelectedIndexChanged(object sender, EventArgs e)
     {
      this.dataTable_项目信息_查询TableAdapter.Fillby客户编号
    (this.dataSet_客户管理.DataTable_项目信息_查询, 
    Convert.ToInt32(this.listBox_客户信息_客户名单.SelectedValue.ToString()));
     }
    

    以上是我的窗体程序中的一段代码,实现一个listbox控件的数据绑定的填充数据的操作,在运行测试的时候很正常,但是关闭程序的时候 抛出了 NullReferenceException异常。以前我也写过类似的代码,没有出现过这样的问题,我该怎么解决。谢谢~

    p.s.

    这个窗体程序是有一个主窗体利用panel控件嵌套另一个窗体来实现程序界面切换,程序工作代码是放在嵌套窗体中的,有几个界面就有几个嵌套窗体,用menuStrip控件来实现嵌套窗体的切换。

     

    2010年9月26日 8:22

答案

  • 在类定义里面加个变量isClosing

    FormClosing

    {

        this.isClosing=true;

    }

    然后在你的事件处理里面就可以判断

    if(!isClosing)

    .....



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Abbey.G 2010年9月29日 6:12
    2010年9月28日 4:16
    版主

全部回复

  • 表达式不要写这么复杂,把SelectedValue和Convert.ToInt32的结果保存到临时变量看看是不是null



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月26日 14:17
    版主
  • 谢谢,是那个转换函数出现了空值,但是在程序运行的时候没有出现空值,为何会在程序关闭的时候出现空值啊?这一点让我很不解,望指教~
    2010年9月27日 0:42
  • 关闭的时候要删除combobox里面的项目吧?结果SelectedValue没有了?

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月27日 1:16
    版主
  • 那么有什么好的解决办法吗?

    我现在是添加一条if判断,如果SelectedValue为null的话,就跳过执行。不知道我这个办法是不是正确的解决方式。

    2010年9月28日 1:08
  • 呃,关闭的时候为什么还要查询数据库?FormClosing的时候设置一个标志,在这个事件里面检查是不是正在关闭,在关闭则跳过数据库查询

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    2010年9月28日 2:24
    版主
  •     /// <summary>
        /// 必需的设计器变量。
        /// </summary>
        private System.ComponentModel.IContainer components = null;
    
        /// <summary>
        /// 清理所有正在使用的资源。
        /// </summary>
        /// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
        protected override void Dispose(bool disposing)
        {
          if (disposing && (components != null))
          {
            components.Dispose();
          }
          base.Dispose(disposing);
        }
    

    好像是这段代码出现了问题吧,我发觉好像是每清理一次托管资源就要查询一遍将被清理资源的状态。这样就出现数据库查询的代码的依赖的托管资源被优先被清理(本程序中的combobox控件),就发生了目前这个异常情况。

    还有您所说的FormClosing事件代码该如何写,能否给个提示或实例,谢谢~

    2010年9月28日 3:05
  • 在类定义里面加个变量isClosing

    FormClosing

    {

        this.isClosing=true;

    }

    然后在你的事件处理里面就可以判断

    if(!isClosing)

    .....



    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful, so they will appear differently to other users who are visiting your thread for the same problem.
    Visual C++ MVP
    • 已标记为答案 Abbey.G 2010年9月29日 6:12
    2010年9月28日 4:16
    版主