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

すべてのフォーム (2 回) を変数として保持する必要はありません。すべての 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 に答える