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

时间:2012-01-22 01:31:22

标签: c# winforms unhandled-exception objectdisposedexception

我收到ObjectDisposedException was unhandled消息Cannot access a disposed object.

在我的课程开始时MyForm myForm = new MyForm();初始化此子表单,然后通过myForm.txtBox.AppendText("Text");在该表单的文本框中添加一些文本,然后使用我的表单打开我的表单时,会发生这种情况一些代码为myForm.Show();的按钮。现在,当我的工作完成后,我可以关闭表格。现在,当我想再次显示数据时,我得到了这个例外。

我想以新的形式保留文本框的内容,但似乎存在一个问题,我没有把所有内容都放在其中。

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

3 个答案:

答案 0 :(得分:3)

来自Form.Close上的MSDN文档:

  

当表单关闭时,在对象中创建的所有资源都是   关闭,表格处理。您可以阻止关闭表单   在运行时通过处理Closing事件并设置Cancel   CancelEventArgs的属性作为参数传递给您的事件   处理程序。如果您要关闭的表单是您的启动表单   申请,你的申请结束。

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

答案 1 :(得分:1)

问题似乎是你在课程开始时创建MyForm的实例,并在每次按下按钮时重新使用它。不幸的是,这不会奏效。一旦表格关闭,它将被处置,因此不再有效。它会在您下次尝试显示时抛出。

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

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

如果存在某种状态,则需要在点击之间保留,例如文本,然后存储但不存储Form实例。

答案 2 :(得分:1)

你应该捕捉FormClosing事件,因为M.Babcock说,但我也建议你查看关闭原因,如果用户请求它,你可以取消并做任何你想做的事:私人

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (e.CloseReason == CloseReason.UserClosing)
    {
        e.Cancel = true;

        // Make your form dissappear of whatever you want
    }
}

否则,如果您愿意,您将无法关闭它。