0

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

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

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

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

4

3 回答 3

3

从 MSDN 文档中Form.Close

当窗体关闭时,对象内创建的所有资源都将关闭并释放窗体。您可以通过处理 Closing 事件并设置作为参数传递给事件处理程序的 CancelEventArgs 的 Cancel 属性来防止在运行时关闭窗体。如果您要关闭的表单是应用程序的启动表单,则您的应用程序将结束。

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

于 2012-01-22T01:50:12.970 回答
1

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

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

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

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

于 2012-01-22T01:59:14.217 回答
1

您应该像 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
    }
}

否则,您将无法在需要时关闭它。

于 2012-01-22T02:41:39.167 回答