打开、关闭并再次打开新表单时出现未处理的异常

本文关键字:表单 异常 未处理 新表单 打开 | 更新日期: 2023-09-27 18:21:07

我正在获取带有消息Cannot access a disposed object.ObjectDisposedException was unhandled

当在我开始上课时用MyForm myForm = new MyForm();初始化这个子窗体,然后用myForm.txtBox.AppendText("Text");向该窗体的文本框中添加一些文本,然后用代码为myForm.Show();的按钮打开我的新窗体时,就会发生这种情况。现在,当我的工作完成后,我可以关闭表单。现在,当我们想再次显示数据时,我会遇到异常。

我想把文本框的内容保留在我的新表单中,但似乎有一个问题,我没有处理掉其中的所有内容。

如何避免这种情况,以便我可以在按下按钮时查看新表单的内容?

打开、关闭并再次打开新表单时出现未处理的异常

来自MSDN关于Form.Close:的文档

当窗体关闭时,在对象中创建的所有资源关闭并处理该表单。您可以阻止关闭窗体在运行时,通过处理"关闭"事件并设置"取消"作为参数传递给事件的CancelEventArgs的属性处理程序。如果您要关闭的表单是您的应用程序,您的应用程序结束。

您可以在表单上捕获Form.Closing事件,取消该事件,并隐藏表单,而不是Close

问题似乎是在类的开头创建MyForm的实例,并在每次按下按钮时重新使用它。不幸的是,这行不通。一旦表单关闭,它将被处理,因此不再有效。下次你试着展示它时,它会扔出去。

解决此问题的最简单方法是完全在按钮单击事件中创建和显示表单。不要在两次点击之间重复使用它的实例。

void OnButtonClick(object sender, EventArgs e) {
  using (MyForm myForm = new MyForm()) {
    myForm.txtBox.AppendText("Test");
    myForm.ShowDialog(this);
  }
}

如果在两次单击之间需要保持某种状态,例如文本,则存储该状态,但不存储Form实例。

您应该像M.Babcock所说的那样捕捉FormClosing事件,但我也建议您检查关闭原因,如果用户要求,您可以取消并执行任何您想做的操作:私人

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;
        // Make your form dissappear of whatever you want
    }
}

否则,您将无法关闭它,以备不时之需。