代码之家  ›  专栏  ›  技术社区  ›  Dan Is Fiddling By Firelight Leniency

控件在第二次打开窗体时释放

  •  2
  • Dan Is Fiddling By Firelight Leniency  · 技术社区  · 14 年前

    第一次从主窗体打开子窗体时,它将正常打开。如果我关闭子窗体的第一个实例,然后重新打开它,但在第一次尝试调用时遇到崩溃 CreateGraphics() OnPaint()

    我设置了断点来监视发生了什么。Dispose()在我第一次关闭窗体时按预期调用。当我第二次开始表格时 MyControlClass 的构造函数被调用,而Dispose方法在异常发生之前未被调用。在例外的时候 this 仍然有效。因此我想知道它是否是 霉菌控制类 最终被释放的;不是实例对象。

    每次调用显示表单的按钮时,我都会创建一个新的表单副本。MyChildForm是由my mt parentform持有的成员,还用于防止同时打开表单的多个副本。

    ShowMyForm()
    {
        myChildForm = new myChildForm Form();
        myChildForm.FormClosed += myChildFormFormClosed;
        myChildForm.Show();
    }
    
    private void myChildFormFormClosed(object sender, FormClosedEventArgs e)
    {
        myChildForm = null;
    }
    

    崩溃的代码行:MyControlClass继承自MyControlClassBase,后者又继承自MyControlClassBaseBase。这一行代码由MyControlClassBase中的鼠标事件触发,并且位于MyControlClassBaseBase中。之后的代码将获取MyControl的缓存图像,使用新创建的图形对象显示它,然后基于鼠标光标位置绘制覆盖图。

    Graphics g = CreateGraphics();
    

    PS因为我相信有人会问:有问题的rube goldberg是由于在winforms中除了最琐碎的情况之外的任何情况下都是假的“透明”的完全失败,以及MyControlClass需要很长时间才能绘制以跟上鼠标光标;但这完全是一个单独的问题。

    1 回复  |  直到 14 年前
        1
  •  3
  •   Vercas    14 年前

    在关闭窗体之后,它被释放,这意味着它只存在于读取字段。

    如果要再次显示同一窗体,请创建另一个实例,或将其隐藏而不是关闭。


    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(); )
    (多亏了索拉克斯)这也将 与MDI儿童一起工作。