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

VB6のFormsコレクションに代わるものは?
アプリケーションで開いているすべてのフォームを取得する

.NET Framework 2.0以降で、Application.OpenFormsを使用する

.NET Framework 2.0以降では、Application.OpenFormsプロパティにより、アプリケーションで開いているすべてのフォームを取得できます。VB.NETでは、My.Application.OpenFormsプロパティでも可能です。

VB.NET
コードを隠すコードを選択
'現在開いているすべてのフォームのタイトルを取得する
For Each f As Form In My.Application.OpenForms
    Console.WriteLine(f.Text)
Next
C#
コードを隠すコードを選択
//現在開いているすべてのフォームのタイトルを取得する
foreach (Form f in Application.OpenForms)
{
    Console.WriteLine(f.Text);
}

.NET Framework 1.1以前

VB6のFormsコレクションに相当するものは.NET Framework 1.1以前では用意されていませんし、フォームオブジェクト専用のコレクションもありません。

「マイクロソフト サポート技術情報 - 308537」の「[HOW TO] Visual Basic .NET で Forms コレクションを作成する方法」では、カスタムのFormsコレクションを作成する方法が紹介されています。

しかしここで紹介されているクラスでは、インデックスを指定してオブジェクトを取得できず、不便です。

そこで、インデックスを指定してオブジェクトを取得できるようにし、さらにInsert、IndexOf、Containsメソッドを追加したコレクションクラスを以下に紹介します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' フォームのコレクション
''' </summary>
Public Class FormCollection
    Inherits CollectionBase

    ''' <summary>
    ''' インデクサ
    ''' </summary>
    Default Public Property Item(ByVal index As Integer) As Form
        Get
            Return CType(List(index), Form)
        End Get
        Set(ByVal Value As Form)
            List(index) = value
        End Set
    End Property

    ''' <summary>
    ''' コレクションにフォームを追加する
    ''' </summary>
    ''' <param name="frm">追加するフォーム</param>
    ''' <returns>追加された位置</returns>
    Public Function Add(ByVal frm As Form) As Integer
        Return List.Add(frm)
    End Function

    ''' <summary>
    ''' コレクションからフォームを削除する
    ''' </summary>
    ''' <param name="frm">削除するフォーム</param>
    Public Sub Remove(ByVal frm As Form)
        List.Remove(frm)
    End Sub

    ''' <summary>
    ''' コレクションにフォームを挿入する
    ''' </summary>
    ''' <param name="index">挿入する位置</param>
    ''' <param name="frm">挿入するフォーム</param>
    Public Sub Insert(ByVal index As Integer, ByVal frm As Form)
        List.Insert(index, frm)
    End Sub

    ''' <summary>
    ''' フォームのインデックスを調べる
    ''' </summary>
    ''' <param name="frm">検索するフォーム</param>
    ''' <returns>フォームのインデックス</returns>
    Public Function IndexOf(ByVal frm As Form) As Integer
        Return List.IndexOf(frm)
    End Function

    ''' <summary>
    ''' コレクションにフォームが格納されているか調べる
    ''' </summary>
    ''' <param name="frm">検索するフォーム</param>
    ''' <returns>コレクションに格納されている時はtrue</returns>
    Public Function Contains(ByVal frm As Form) As Boolean
        Return List.Contains(frm)
    End Function
End Class
C#
コードを隠すコードを選択
/// <summary>
/// フォームのコレクション
/// </summary>
public class FormCollection : CollectionBase
{
    /// <summary>
    /// インデクサ
    /// </summary>
    public Form this[int index]
    {
        get
        {
            return (Form) List[index];
        }
        set
        {
            List[index] = value;
        }
    }

    /// <summary>
    /// コレクションにフォームを追加する
    /// </summary>
    /// <param name="frm">追加するフォーム</param>
    /// <returns>追加された位置</returns>
    public int Add(Form frm)
    {
        return List.Add(frm);
    }

    /// <summary>
    /// コレクションからフォームを削除する
    /// </summary>
    /// <param name="frm">削除するフォーム</param>
    public void Remove(Form frm)
    {
        List.Remove(frm);
    }

    /// <summary>
    /// コレクションにフォームを挿入する
    /// </summary>
    /// <param name="index">挿入する位置</param>
    /// <param name="frm">挿入するフォーム</param>
    public void Insert(int index, Form frm)
    {
        List.Insert(index, frm);
    }

    /// <summary>
    /// フォームのインデックスを調べる
    /// </summary>
    /// <param name="frm">検索するフォーム</param>
    /// <returns>フォームのインデックス</returns>
    public int IndexOf(Form frm)
    {
        return List.IndexOf(frm);
    }

    /// <summary>
    /// コレクションにフォームが格納されているか調べる
    /// </summary>
    /// <param name="frm">検索するフォーム</param>
    /// <returns>コレクションに格納されている時はtrue</returns>
    public bool Contains(Form frm)
    {
        return List.Contains(frm);
    }
}

このコレクションの使い方は、例えば次のような感じです。

VB.NET
コードを隠すコードを選択
'Dim _forms As New FormCollection
'というフィールドが宣言されているものとする

'Form1オブジェクトを作成
Dim f As New Form1
'コレクションに追加する
_forms.Add(f)

'インデックス0のフォームを表示する
_forms(0).ShowDialog()
C#
コードを隠すコードを選択
//FormCollection _forms = new FormCollection();
//というフィールドが宣言されているものとする

//Form1オブジェクトを作成
Form1 f = new Form1();
//コレクションに追加する
_forms.Add(f);

//インデックス0のフォームを表示する
_forms[0].ShowDialog()

なお、このフォームコレクションには、開かれたフォームが自動的に追加されたり、閉じられたフォームが自動的に削除される機能がありません。これらの処理は自分で行う必要があります。

  • 履歴:
  • 2007/1/15 「.NET Framework 2.0以降で、Application.OpenFormsを使用する」を追加。

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

  • .NET Tipsをご利用いただく際は、注意事項をお守りください。