C#中mdi父级的子表单

时间:2012-05-10 06:27:19

标签: c# winforms

我使用以下代码在MDI父表单中显示子表单。如您所知,单击该按钮将显示一个新表单。继续单击按钮,屏幕将填充空白表格。为了防止这种情况发生,我移动了在按钮之外创建表单的代码。

像这样:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    Form2 f2 = new Form2();    

    private void button1_Click(object sender, EventArgs e)
    {
        f2.MdiParent = this;
        f2.Show();
    }

但是,当我关闭子表单并想再次打开它时,它不会让我。

请帮我解决这个问题。

2 个答案:

答案 0 :(得分:5)

您需要跟踪表单状态,以便了解需要创建新表单状态。像这样:

private Form2 f2;    

private void button1_Click(object sender, EventArgs e)
{
    if (f2 == null) {
       f2 = new Form2();
       f2.MdiParent = this;
       f2.FormClosed += delegate { f2 = null; };
       f2.Show();
    }
    else {
       f2.Activate();
    }
}

答案 1 :(得分:1)

您不希望将所有表单(两次)保留为变量。所有mdi表单都会添加到您的MdiChildren集合中。因此,您需要检查是否需要显示您创建的表单。 像这样:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2();
    f2.MdiParent = this; 
    OpenMdiChild(f2);
} 
private void OpenMdiChild(Form newForm)
{
    bool found = false;
    foreach (Form frm in this.MdiChildren)
    {
        if (frm.GetType() == newForm.GetType())
                {
                        frm.Activate();
                        frm.Focus();
                        //frm.BringToFront();
            found = true;
            break;
                }
    }
    if (!found)
    {
        frm.Show();
    }
}

如果您希望用户只打开1个表单,可以将OpenMdi--方法更改为:

private void OpenMdiChild(Form newForm) 
{ 
    bool found = (this.MdiChildren.Length > 0);  
    if (!found) 
    { 
        foreach (Form frm in this.MdiChildren) 
        { 
            if (frm.GetType() == newForm.GetType()) 
            { 
            frm.Activate(); 
                    frm.Focus(); 
                    //frm.BringToFront(); 
                    found = true; 
                break; 
                } 
        } 
    if (!found)
    {
            frm.Show(); 
    }
    } 
}