为什么我的表单在访问ListBox.SelectedItem.ToString()时会尝试处理?

时间:2009-10-27 19:04:05

标签: c# winforms visual-studio-2008 dispose

我正在为大学项目开发​​一个小型POS。 我有一个表单作为POS主窗口,具有数据网格等。另外,我有一个表单是敏感搜索或增量搜索,我希望该表单,在列表框中选择一个项目并将其返回到主窗口。现在我在main中有一个属性,它将该项作为字符串获取,当用户单击搜索表单上的OK按钮时,我想在主窗口上设置该属性。

除了一件事之外,一切都很有效:当我尝试访问listBox_Codigo.SelectedItem.ToString();时 该应用程序尝试处理和关闭所有窗口... 有人知道为什么吗?

我只需要在该列表框中选择的字符串并将其设置为主窗口,如下所示:

var Principal = (PDQ.Cajero)this.ParentForm;
                Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString();
                this.DialogResult = DialogResult.OK;
                this.Close();

其中PDQ.Cajero是主窗体,它调用此窗体。

更新:我刚刚完成调试,就在程序到达之后 listBox_Codigo.SelectedItem.ToString(); 程序跳转到Dispose()

更新2 这是我的完整方法:

private void button1_Click(object sender, EventArgs e)
    {
        if (listBox_Codigo.SelectedItem == null)
        {
            if (MessageBox.Show(this, "No se puede ingresar un producto sin seleccionarlo.\n ¿Desea intentarlo de nuevo, o Salir?", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
            {
                DialogResult = DialogResult.Cancel;
                this.Close();
            }
        }
        else
        {
            var Principal = (PDQ.Cajero)this.ParentForm;
            Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString();
            this.DialogResult = DialogResult.OK;
            this.Close();

        }
    }

所以如果值为null,则问题不是......

2 个答案:

答案 0 :(得分:4)

可能 没有SelectedItem(意味着该属性的值为null)。在这种情况下,您的代码会抛出NullReferenceException,因为您无法在null引用上调用函数。因为您没有捕获它,所以应用程序正在尝试退出时将其捕获到更高级别。这就是调用你的Dispose方法。

答案 1 :(得分:1)

我猜这个表单正在处理,因为你没有处理NullReferenceException

我在GUI中进行异常处理的一般经验法则是在所有事件处理程序中都有一个try-catch块,它将异常记录到文件中并通知用户错误。

你对这段代码有什么看法?

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        if (listBox_Codigo.SelectedItem == null)
        {
            if (MessageBox.Show(this, "No se puede ingresar un producto sin seleccionarlo.\n ¿Desea intentarlo de nuevo, o Salir?", "Error", MessageBoxButtons.RetryCancel, MessageBoxIcon.Exclamation) == DialogResult.Cancel)
            {
                DialogResult = DialogResult.Cancel;
                this.Close();
            }
        }
        else
        {
            var Principal = (PDQ.Cajero)this.ParentForm;
            Principal.CodigoInsertado = listBox_Codigo.SelectedItem.ToString();
            this.DialogResult = DialogResult.OK;
            this.Close();
        }
   }
   catch (Exception ex)
   {
        MessageBox.Show(ex.ToString());
        //LogException(ex);
   }
}