打开第二次打开的控件

时间:2010-11-08 20:33:41

标签: c# winforms

我第一次打开主表单中的一个子表单时,它正常打开。如果我关闭子表单的第一个实例然后重新打开它,但是当我第一次尝试在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中的假“透明度”完全失败跟上鼠标光标;但这完全是一个单独的问题。

1 个答案:

答案 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儿童一起工作。