Web検索はbingがおすすめ!

MdiClient のイベントによりフォームの追加、削除を検出する - C#

MdiClientのControlAdded,ControlRemovedイベントハンドラを実装することでMDIアプリケーションに子フォームが追加、削除されたタイミングを検出できるようになります。

UI

以下のUIを準備します。

FormMain

IsMdiContainerプロパティをTrueにします。

FormChild


FormControl

ボタンとテキストボックスを配置します。


テキストボックスのMultiLinesプロパティをTrueにします。Modifiersプロパティを"Public"にします。


コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace MDIClientEvent
{
  public partial class FormMain : Form
  {
    System.Windows.Forms.MdiClient mc;
    FormControl fcnt;
 
    public FormMain()
    {
      InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
      fcnt = new FormControl();
      fcnt.MdiParent = this;
      fcnt.Show();
      
      foreach (System.Windows.Forms.Control c in Controls) {
        if (c is System.Windows.Forms.MdiClient) {
          mc = (System.Windows.Forms.MdiClient)c;
          mc.ControlAdded += new ControlEventHandler(MDIClient_ControlAdded);
          mc.ControlRemoved += new ControlEventHandler(MDIClient_ControlRemoved);
        }
      }
    }

    private void MDIClient_ControlAdded(object sender, ControlEventArgs e)
    {
      fcnt.textBox1.Text += "MDI子フォーム追加\r\n";

    }

    private void MDIClient_ControlRemoved(object sender, ControlEventArgs e)
    {
      fcnt.textBox1.Text += "MDI子フォーム削除\r\n";
    }

  }
}

解説

private void FormMain_Load(object sender, EventArgs e)
{
  fcnt = new FormControl();
  fcnt.MdiParent = this;
  fcnt.Show();
      
  foreach (System.Windows.Forms.Control c in Controls) {
    if (c is System.Windows.Forms.MdiClient) {
      mc = (System.Windows.Forms.MdiClient)c;
      mc.ControlAdded += new ControlEventHandler(MDIClient_ControlAdded);
      mc.ControlRemoved += new ControlEventHandler(MDIClient_ControlRemoved);
    }
  }
}
FormControlのインスタンスを作成しフォームを表示します。
foreachループを用いてフォームのコントロールを列挙します。"System.Windows.Forms.MdiClient"であるコントロールを見つけます。MdiClientのControlAdded イベントとControlRemoved イベントハンドラを設定します。

private void MDIClient_ControlAdded(object sender, ControlEventArgs e)
{
  fcnt.textBox1.Text += "MDI子フォーム追加\r\n";
}

private void MDIClient_ControlRemoved(object sender, ControlEventArgs e)
{
  fcnt.textBox1.Text += "MDI子フォーム削除\r\n";
}
ControlAdded イベントとControlRemoved イベントの実装です。テキストボックスにメッセージを表示します。

実行結果

プロジェクトを実行します。下図のフォームが表示されます。


Button1をクリックするとMDI子フォームが追加されます。また、テキストボックスにフォームが追加された旨のメッセージが表示されます。


フォームを閉じるとテキストボックスにフォームが削除された旨のメッセージが表示されます。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2012-05-20
iPentec all rights reserverd.