【问题标题】:Unhandled exception when opening then closing and once again opening a new form打开然后关闭并再次打开新表单时出现未处理的异常
【发布时间】:2012-01-22 01:31:21
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你是如何“关闭”表单的?
  • @M.Babcock,点击右上角的 x 按钮。
  • 错误是因为之前的表单没有被垃圾回收......你是在为表单的实例重用相同的变量,还是相同的表单实例?

标签: c# winforms unhandled-exception objectdisposedexception


【解决方案1】:

来自Form.Close 上的 MSDN 文档:

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

您可以捕获表单上的Form.Closing 事件,取消该事件,然后隐藏表单而不是Closeing。

【讨论】:

  • 花了我一段时间,但看起来不错。隐藏然后重新显示是有效的。
【解决方案2】:

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

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

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

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

【讨论】:

  • 只是为了我个人的教育,保持表单实例处于活动状态有什么害处(特别是如果它每次重新显示时都会重新初始化)?在我看来,最好保持表单处于活动状态,直到它完全不再使用(例如应用程序退出)以避免不得不重新实例化它。我被误导了吗?
  • 好吧,我可以这样做。但是后来我必须做更多的代码来将我的数据保存在一个数组中,然后每次单击按钮时将数据发送到表单。我正在尝试查看从父表单添加的内容。
【解决方案3】:

您应该像 M.Babcock 所说的那样捕获 FormClosing 事件,但我也建议您检查关闭原因,如果用户请求它,您可以取消并做任何您想做的事情:private

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

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

否则你将无法关闭它以防万一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2018-11-05
    • 2018-07-02
    相关资源
    最近更新 更多