打开封闭的表格

时间:2012-03-10 07:58:29

标签: c# forms show objectdisposedexception

我想知道如何使用this.Close()重新打开封闭的表单。每次我尝试使用Mainmenu.Show()打开封闭的表单时,异常都会抛出错误“无法访问已处置的对象。对象名称:Mainmenu”。

我怎样才能再次打开它?

4 个答案:

答案 0 :(得分:3)

Close上调用Form方法时,您无法调用Show方法使表单可见,因为表单的资源已被释放,即Disposed 。要隐藏表单然后使其可见,请使用Control.Hide方法。

from MSDN

如果您想重新打开已关闭的表单,则需要以与创建时相同的方式重新创建它 - 首先:

YourFormType Mainmenu=new YourFormType();
Mainmenu.Show();

答案 1 :(得分:2)

我假设您有一个主窗体,它会创建一个非模态子窗体。由于此子表单可以独立于主表单关闭,因此您可以有两种方案:

  1. 尚未创建子表单,或者已关闭子表单。在这种情况下,创建表单并显示它。
  2. 子表单已在运行。在这种情况下,您只需要显示它(它可能会被最小化,您将需要还原它。)
  3. 基本上,您的主要表单应通过处理FormClosed事件来跟踪子表单的生命周期:

    class MainForm : Form
    {
        private ChildForm _childForm;
    
        private void CreateOrShow()
        {
            // if the form is not closed, show it
            if (_childForm == null) 
            {
                _childForm = new ChildForm();
    
                // attach the handler
                _childForm.FormClosed += ChildFormClosed;
            }
    
            // show it
            _childForm.Show();
        }
    
        // when the form closes, detach the handler and clear the field
        void ChildFormClosed(object sender, FormClosedEventArgs args)
        {
            // detach the handler
            _childForm.FormClosed -= ChildFormClosed;
    
            // let GC collect it (and this way we can tell if it's closed)
            _childForm = null;
        }
    }
    

答案 2 :(得分:0)

您无法显示已关闭的表单。 你可以调用this.Hide()来关闭表单。 稍后你可以调用form.Show();

或者您需要重新创建表单。

答案 3 :(得分:0)

智能呈现代码上面的小增加

private void CreateOrShow()
{
    // if the form is not closed, show it
    if (_childForm == null || _childFom.IsDisposed ) 
    {
        _childForm = new ChildForm();

        // attach the handler
        _childForm.FormClosed += ChildFormClosed;
    }

    // show it
    _childForm.Show();
}

// when the form closes, detach the handler and clear the field
void ChildFormClosed(object sender, FormClosedEventArgs args)
{
    // detach the handler
    _childForm.FormClosed -= ChildFormClosed;

    // let GC collect it (and this way we can tell if it's closed)
    _childForm = null;
}