3

子フォームが MDI 親から追加または削除されたかどうかを確認するために使用できるイベントはありますか?

4

8 に答える 8

7

はい。メイン MDI フォームで、MdiChildActivated イベントに接続します。

そのようです:

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.MdiChildActivate += new EventHandler(Form1_MdiChildActivate);
        }

        void Form1_MdiChildActivate(object sender, EventArgs e)
        {
            MessageBox.Show("Activated");
        }

        private void addToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Form form2 = new Form2();
            form2.MdiParent = this;
            form2.Show();
        }
    }

そして、そのイベントは、子フォームがアクティブ化または非アクティブ化されたときに発生します。

于 2009-02-11T18:56:58.353 に答える
4

イベントを接続しMdiChildActivate、認識された子のリストを保持します。新しいフォームがアクティブ化されたら、FormClosedイベントも関連付けます。

private List<Form> ChildFormList = new List<Form>();

private void MyForm_MdiChildActivate(object sender, EventArgs e)
{
    Form f = this.ActiveMdiChild;

    if (f == null)
    {
        //the last child form was just closed
        return;
    }

    if (!ChildFormList.Contains(f))
    {
        //a new child form was created
        ChildFormList.Add(f);
        f.FormClosed += new FormClosedEventHandler(ChildFormClosed);
    }
    else
    {
        //activated existing form
    }
}

private void ChildFormClosed(object sender, FormClosedEventArgs e)
{
    //a child form was closed
    Form f = (Form)sender;
    ChildFormList.Remove(f);
}
于 2009-05-20T15:57:51.990 に答える
1

これは何年も遅すぎることに気づきましたが、ここでの回答がこれを解決するのに役立ったので、.net 4 の MdiChildren 配列を使用してこれが正常に機能することに言及します。その閉鎖かどうかを伝えるために。

すなわち:

    private void frmContainer_MdiChildActivate(object sender, EventArgs e)
    {
        tabWindows.RefreshLayout(this.MdiChildren.ToList());
    }

    public void RefreshLayout(List<Form> forms)
    {
        this.nextButtonLeft = 1;
        panel1.Controls.Clear();
        foreach (Form frm in forms)
        {
            if (!(frm.Disposing || frm.IsDisposed)) { addButton(frm); }
        }
    }
于 2012-08-16T03:28:21.073 に答える
0
private void closeToolStripMenuItem1_Click(object sender, EventArgs e)
    {
      List<Form> fm = this.MdiChildren.ToList();
        if(fm!=null && fm.Count>0)
        {
            foreach(Form lfm in fm)
            {
                lfm.Close();
            }
        }
    }
于 2016-08-24T22:25:19.060 に答える
-2

私は最近、MDIchildren が開いていない時期をおおよそ特定したかったので、子フォームが開いていない場合にのみ、「やるべきこと」ボタンがたくさんあるパネルを表示できました。(デザインのアイデアを模索しているだけです)。

私の最終的な解決策はエレガントに単純でした.1つの子フォームが開いているとMdiChildActivateイベントが判断したときに、親フォームにタイマーを追加し、タイマーを開始します。

    private void MyForm_MdiChildActivate(object sender, EventArgs e)
    {
        this.panel_Tools.Visible = false;
        if (this.MdiChildren.Count() == 1)
        {
            this.timer_WindowsCounter.Start();
        }
        else
        {
            this.timer_WindowsCounter.Stop();
        }

    }


    private void timer_WindowsCounter_Tick(object sender, EventArgs e)
    {
        if (this.MdiChildren.Count() == 0)
        {
            this.panel_Tools.Visible = true;
            this.timer_WindowsCounter.Stop();
        }
    }
于 2013-01-17T02:35:51.233 に答える