1

我使用以下代码在 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();
    }

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

请帮我解决这个问题。

4

2 回答 2

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();
    }
}
于 2012-05-10T06:41:31.260 回答
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(); 
    }
    } 
}
于 2012-05-10T06:57:54.390 回答