0

Form12 つのラジオ ボタン (rb1rb2) と 1 つの通常のボタン ( )がありbtnます。をクリックすると、 ifの MDI 子がチェックされているか、通常のifがチェックされているので、btn開く必要があります。また、一度に開くことができるのは 1 つだけです。Form2Form1rb1Dialogrb2Form2

これは私のコードです:

public partial class Form1 : Form
{

    Form2 f2;

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 != null) 
        {
            MessageBox.Show("Close form!");
            return;
        }

        f2 = new Form2();
        if (radioButton1.Checked == true)
        {
            this.IsMdiContainer = true;
            f2.MdiParent = this;
            f2.Show();
        }
        else
        {
            f2.Show();
        }

        f2.FormClosed += f2_FormClosed;

    }

    void f2_FormClosed(object sender, FormClosedEventArgs e)
    {
        this.IsMdiContainer = false;
        f2 = null;
    }

}

Form2MDIの子として最大化してから閉じる場合を除いて、すべてが正常に機能します。その後、画面は同じままです (私は閉じていませんでしたForm2) が、 new を開くことができForm2、その後Form1のタイトルは " Form1 - [Form2]" で、プロセスを繰り返すと " Form1 - [Form2] - [Form2]" などになります。

私は自分のf2_FormClosed方法が

    void f2_FormClosed(object sender, FormClosedEventArgs e)
    {
        f2.Hide(); // <<<<<<<<-----------NEW
        this.IsMdiContainer = false;
        f2 = null;
    }

しかし、理由はわかりません。Form2閉じる必要がありますが、なぜ非表示にする必要があるのか​​ わかりません。

ありがとう!

4

1 に答える 1

0

Hans に同意します。実行時に IsMdiContainer を切り替えるのは不安定であり、まだ見たことのない他の副作用が発生する可能性があります。

アプリの別のデザインを真剣に検討してください。

それを念頭に置いて、これがおそらく私が一日中投稿する最も愚かなハックです。

public partial class Form1 : Form
{

    Form2 f2;
    System.Windows.Forms.Timer tmr = new System.Windows.Forms.Timer();

    public Form1()
    {
        InitializeComponent();
        tmr.Interval = 100;
        tmr.Enabled = false;
        tmr.Tick += delegate (object sender, EventArgs e) {
            tmr.Stop();
            this.IsMdiContainer = false;
        };
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (f2 != null)
        {
            MessageBox.Show("Close form!");
            return;
        }

        f2 = new Form2();
        f2.FormClosed += delegate(object sender2, FormClosedEventArgs e2) { 
            f2 = null; 
        };    
        if (radioButton1.Checked == true)
        {
            this.IsMdiContainer = true;
            f2.FormClosed += delegate(object sender3, FormClosedEventArgs e3) { 
                tmr.Start();
            };    
            f2.MdiParent = this;
        }
        f2.Show();
    }

}

*最初は IsMdiContainer を変更する呼び出しを呼び出してみましたが、うまくいかなかったので、Timer に切り替えました。働く愚かさ。このソリューションは慎重に使用してください...

于 2015-02-06T17:15:05.753 に答える