DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

MDI子フォームが追加、削除されたことを知る

MDI親フォームに子フォームを追加、あるいは削除するという動作は、開発者がそのようなコードを書くことにより可能となるため、MDI親フォームに子フォームが追加、削除されたかという判断は、開発者自身ができるはずです。

もちろんこのような方法がベストですし、全く問題ありませんが、「MDI親フォームの背景色を変更する」で紹介したMdiClientコントロールのControlAdded、ControlRemovedイベントを使えば、子フォームの追加、削除をイベントで知ることができます。

注意:ただし、.NET Framework 1.1以前のヘルプによると、MdiClientクラスは「独自に作成したコード内で直接使用することはできません。」とありますので、この方法が適切であるかは保障できません。.NET Framework 2.0からは、このような文言はなくなりました。

以下にサンプルを示します。このコードはMDI親フォームに記述されており、ParentForm_LoadはフォームのLoadイベントハンドラとして登録されているものとします。

VB.NET
コードを隠すコードを選択
'MDI親フォームのLoadイベントハンドラ
Private Sub ParentForm_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
    Me.IsMdiContainer = True
    'MdiClientの取得
    Dim mc As System.Windows.Forms.MdiClient = GetMdiClient(Me)

    'MdiClientのControlAddedとControlRemovedイベントハンドラを追加
    AddHandler mc.ControlAdded, AddressOf mc_ControlAdded
    AddHandler mc.ControlRemoved, AddressOf mc_ControlRemoved
End Sub

Private Sub mc_ControlAdded( _
    ByVal sender As Object, ByVal e As ControlEventArgs)
    Console.WriteLine("子フォームが追加されました。")
End Sub 'mc_ControlAdded

Private Sub mc_ControlRemoved( _
    ByVal sender As Object, ByVal e As ControlEventArgs)
    Console.WriteLine("子フォームが削除されました。")
End Sub 'mc_ControlRemoved

''' <summary>
''' フォームのMdiClientコントロールを探して返す
''' </summary>
''' <param name="f">MdiClientコントロールを探すフォーム</param>
''' <returns>見つかったMdiClientコントロール</returns>
Public Shared Function GetMdiClient( _
    ByVal f As System.Windows.Forms.Form) _
    As System.Windows.Forms.MdiClient
    Dim c As System.Windows.Forms.Control
    For Each c In f.Controls
        If TypeOf c Is System.Windows.Forms.MdiClient Then
            Return CType(c, System.Windows.Forms.MdiClient)
        End If
    Next c
    Return Nothing
End Function
C#
コードを隠すコードを選択
//MDI親フォームのLoadイベントハンドラ
private void ParentForm_Load(object sender, System.EventArgs e)
{
    this.IsMdiContainer = true;
    //MdiClientの取得
    System.Windows.Forms.MdiClient mc = GetMdiClient(this);

    //MdiClientのControlAddedとControlRemovedイベントハンドラを追加
    mc.ControlAdded += new ControlEventHandler(mc_ControlAdded);
    mc.ControlRemoved += new ControlEventHandler(mc_ControlRemoved);
}

private void mc_ControlAdded(object sender, ControlEventArgs e)
{
    Console.WriteLine("子フォームが追加されました。");
}

private void mc_ControlRemoved(object sender, ControlEventArgs e)
{
    Console.WriteLine("子フォームが削除されました。");
}

/// <summary>
/// フォームのMdiClientコントロールを探して返す
/// </summary>
/// <param name="f">MdiClientコントロールを探すフォーム</param>
/// <returns>見つかったMdiClientコントロール</returns>
public static System.Windows.Forms.MdiClient 
    GetMdiClient(System.Windows.Forms.Form f)
{
    foreach (System.Windows.Forms.Control c in f.Controls)
        if (c is System.Windows.Forms.MdiClient)
            return (System.Windows.Forms.MdiClient) c;
    return null;
}

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。