我第一次打开主表单中的一个子表单时,它正常打开。如果我关闭子表单的第一个实例然后重新打开它,但是当我第一次尝试在CreateGraphics()
方法之外调用OnPaint()
时,我会崩溃。我得到的例外是:“无法访问已处置的对象。对象名称:'MyControlClass'。”
我设置了断点来监控正在发生的事情。第一次关闭表单时,会按预期调用Dispose()。当我启动表单时,第二次调用MyControlClass
的构造函数,并且在异常之前不调用Dispose方法。在异常时this
仍然有效。因此,我想知道它是否真的是MyControlClass
的静态组件最终被处理掉了;不是实例对象。
每次调用显示它的按钮时,我都会创建表单的新副本。 MyChildForm是由我的mt parentform持有的成员,也用于防止一次打开表单的多个副本。
ShowMyForm()
{
myChildForm = new myChildForm Form();
myChildForm.FormClosed += myChildFormFormClosed;
myChildForm.Show();
}
private void myChildFormFormClosed(object sender, FormClosedEventArgs e)
{
myChildForm = null;
}
崩溃的代码行:MyControlClass继承自MyControlClassBase,MyControlClassBase继承自MyControlClassBaseBase。这行代码由MyControlClassBase中的鼠标事件触发,并在MyControlClassBaseBase中。此后的代码将采用MyControl的缓存图像,使用新创建的Graphics对象显示它,然后根据鼠标光标位置绘制叠加层。
Graphics g = CreateGraphics();
PS因为我肯定会有人会问:有问题的rube goldberg是由于在最简单的情况下除了最简单的情况以及MyControlClass需要太长时间才能绘制的winforms中的假“透明度”完全失败跟上鼠标光标;但这完全是一个单独的问题。
答案 0 :(得分:3)
表单关闭后,它会被释放 - 这意味着它只是为了读取字段而存在。
如果要再次显示相同的表单,请创建另一个实例或只是隐藏它而不是关闭。
MyForm f = new MyForm();
f.Show();
// After closed, it will be disposed.
所以我们需要做同样的步骤再次展示它:
f = new MyForm();
f.Show();
现在你将得到一个全新的,相同的形式。
但要在关闭时隐藏它,您可能需要以下代码:
private void MyForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (e.CloseReason == CloseReason.UserClosing)
{
e.Cancel = true;
Hide();
}
}
请注意,不可以使用模态表单。 (ShowDialog();
)
(感谢Sorax)这也将不与MDI儿童一起工作。