我收到ObjectDisposedException was unhandled
消息Cannot access a disposed object.
在我的课程开始时MyForm myForm = new MyForm();
初始化此子表单,然后通过myForm.txtBox.AppendText("Text");
在该表单的文本框中添加一些文本,然后使用我的表单打开我的表单时,会发生这种情况一些代码为myForm.Show();
的按钮。现在,当我的工作完成后,我可以关闭表格。现在,当我想再次显示数据时,我得到了这个例外。
我想以新的形式保留文本框的内容,但似乎存在一个问题,我没有把所有内容都放在其中。
如何避免这种情况,以便每次按下按钮都可以查看新的表单内容?
答案 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
}
}
否则,如果您愿意,您将无法关闭它。