【问题标题】:Object reference not set to an instance of an object Exception when closing my form关闭我的表单时,对象引用未设置为对象的实例异常
【发布时间】:2013-05-17 05:34:23
【问题描述】:

当我想关闭我的表单时,cmbProspecten_SelectedIndexChanged 方法会被调用。但是 cmbProspecten 中的值是空的,所以我得到了

NullReferenceException:对象引用未设置为 对象。

知道如何解决这个问题吗? 我在该行收到错误消息:"if(setInMail(Convert.ToInt32(dr[0]), Convert.ToInt32(cmbProspecten.SelectedValue.ToString())) == true)

    private void cmbProspecten_SelectedIndexChanged(object sender, EventArgs e)
    {
        lstOntvangen.Items.Clear();

        OleDbConnection con = new OleDbConnection(connstring);
        string query = "SELECT Ontwikkeldossier.OntwikkeldossierID, [E-mailcampagne].CampagneID FROM [E-mailcampagne], Ontwikkeldossier WHERE (([Ontwikkeldossier].[Startdatum]>=[E-mailcampagne].[StartdatumOpl] And [Ontwikkeldossier].[Startdatum]<=[E-mailcampagne].[EinddatumOpl])) ORDER BY [E-mailcampagne].Naam";

        OleDbCommand cmd = new OleDbCommand(query, con);
        con.Open();
        OleDbDataAdapter da = new OleDbDataAdapter();
        da.SelectCommand = cmd;
        DataSet ds = new DataSet();
        DataTable dt = new DataTable();
        da.Fill(ds);
        dt = ds.Tables[0];
        con.Close();
        int i = 0;
        foreach (DataRow dr in ds.Tables[0].Rows)
        {
            EmailMarketingDataset._E_mailcampagneRow emailrow = emailMarketingDataSet._E_mailcampagne.FindByCampagneID(Convert.ToInt32(dr[1]));
            EmailMarketingDataset.OntwikkeldossierRow ontwikkelrow = emailMarketingDataSet.Ontwikkeldossier.FindByOntwikkeldossierID(Convert.ToInt32(dr[0]));
            if (i != 0)
            {
                if (lstOntvangen.Items[i - 1].ToString() == emailrow.Naam)
                {
                    if(setInMail(Convert.ToInt32(dr[0]),Convert.ToInt32(cmbProspecten.SelectedValue.ToString())) == true)
                        lstOntvangen.Items.Add(ontwikkelrow.Titel);
                }
                else
                {
                    if (setInMail(Convert.ToInt32(dr[0]), Convert.ToInt32(cmbProspecten.SelectedValue.ToString())) == true)
                    {
                        lstOntvangen.Items.Add(" ");
                        lstOntvangen.Items.Add(emailrow.Naam);
                        lstOntvangen.Items.Add(ontwikkelrow.Titel);
                    }
                    i = lstOntvangen.Items.Count - 1;
                }
            }
            else
            {
                if (setInMail(Convert.ToInt32(dr[0]), Convert.ToInt32((cmbProspecten.SelectedValue.ToString())) == true)
                {
                    lstOntvangen.Items.Add(emailrow.Naam);
                    lstOntvangen.Items.Add(ontwikkelrow.Titel);
                    i++;
                }
            }
        }
    }

【问题讨论】:

    标签: c# visual-studio-2010 nullreferenceexception


    【解决方案1】:

    在 form_onclosing 事件上添加cmbProspecten.SelectedIndex = -1

    并像这样添加 selectedindexchanged 事件..

    private void cmbProspecten_SelectedIndexChanged(object sender, EventArgs e)
    {
    
        if cmbProspecten.selectedindex=-1 {return ;}
        lstOntvangen.Items.Clear();
    

    【讨论】:

      【解决方案2】:

      这实际上是一个相当普遍的问题。您发现在关闭表单时引发了一些 UI 事件,这会导致问题,因为在您的处理程序运行之前,事情已被部分处理或清理。

      有时您可以通过引入布尔值isDisposing 字段并将其设置为trueDispose() 方法的开头来解决此问题。

      然后在您的处理程序中,如果isDisposing 为真,则在它开始时提前返回。

      或者,您可以添加一个布尔值 isClosing 字段并覆盖 Form.OnFormClosing() 并将 isClosing 设置为 true。

      如果isClosing 为真,您可以从失败的处理程序中提前返回。

      【讨论】:

      • “尽早返回”是什么意思?
      • @CharlotteVancraeynest 我的意思是在方法的开头添加以下内容:if (isClosing) return;
      • 对不起,我真的不明白。我是一名商务和 IT 专业的学生,​​我只有基本的编程知识。
      • @CharlotteVancraeynest 你的意思是你不明白 if (isClosing) return; 在方法中的含义?
      • 没关系,@matzone 的回答奏效了。无论如何,感谢您抽出宝贵时间帮助我!
      猜你喜欢
      • 1970-01-01
      • 2012-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-08
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多