打开、关闭并再次打开新表单时出现未处理的异常
本文关键字:表单 异常 未处理 新表单 打开 | 更新日期: 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
}
}
否则,您将无法关闭它,以备不时之需。