关闭窗体时,对象引用未设置为对象异常的实例
本文关键字:对象 异常 实例 设置 窗体 对象引用 | 更新日期: 2023-09-27 18:14:42
当我想关闭我的表单时,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++;
}
}
}
}
On form_onclosing event add cmbProspecten.SelectedIndex = -1
并像这样添加selectedindexchanged事件…
private void cmbProspecten_SelectedIndexChanged(object sender, EventArgs e)
{
if cmbProspecten.selectedindex=-1 {return ;}
lstOntvangen.Items.Clear();
这实际上是一个相当常见的问题。你发现一些UI事件在窗体关闭时被引发,这会导致问题,因为在你的处理程序运行之前,事情已经被部分处理或清理了。
有时您可以通过在Dispose()
方法的开头引入一个布尔isDisposing
字段并将其设置为true
来解决这个问题。
然后在你的处理程序中,如果isDisposing
为真,在它开始时做一个提前返回。
或者你可以添加一个布尔值的isClosing
字段并覆盖Form.OnFormClosing()
,并将isClosing
设置为true。
如果isClosing
为真,则可以从失败的处理程序中提前返回。