.NET TIPS

Windowsフォームでフォームのコレクションを使用するには?[2.0のみ、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2006/07/14

 複数のフォームを開くWindowsアプリケーションでは、各フォームを操作したり、フォーム間でのデータのやりとりを行ったりするために、作成したフォームへの参照を保持しておく必要がある。

 そのような目的のためにVisual Basic 6.0では「Formsコレクション」が存在したが、.NET Framework 1.xでは、その管理は自分で行う必要があった(参照:マイクロソフトのサポート技術情報「Visual Basic .NETでForms コレクションを作成する方法」)。

 .NET Framework 2.0では、Applicationクラス(System.Windows.Forms名前空間)にOpenFormsプロパティが追加されており、これがフォームのコレクションとなっている。このプロパティを利用することにより、明示的にフォームの管理を行わなくても、アプリケーションで開いているすべてのフォームにいつでもアクセスできる。

■フォームのコレクションであるFormCollectionクラス

 ApplicationクラスのOpenFormsプロパティには、フォームのコレクションとして、読み取り専用であるFormCollectionクラス(System.Windows.Forms名前空間)のオブジェクトがセットされる。

 フォームのインスタンスを作成し、Showメソッドを呼び出すなどしてフォームを表示すると、そのフォームは自動的にコレクションに追加され、また、Closeメソッドなどによりフォームを閉じれば、フォームはコレクションから自動的に削除される。

 また、FormCollectionクラスにはインデクサが実装されており、インデックス番号あるいはフォームの名前(フォームのNameプロパティの値)により、各フォームにアクセスできる。

 なお、フォームはインスタンスを作成しただけではコレクションに追加されず、一度は表示する必要がある。また、すでに表示したフォームをHideメソッドなどで非表示にするだけではコレクションからは削除されない。

■OpenFormsプロパティを利用したサンプル・プログラム

 以下にOpenFormsプロパティを利用したサンプル・プログラムを示す。

 このサンプル・プログラムの実行時の画面は次のようになる。まずメインのフォームで[フォーム作成]ボタンを押すと、番号の付けられた新しいフォームが1つ作成される。リストボックスには現在開かれているフォームの一覧が表示される。リストボックスで項目を選択し、[閉じる]ボタンを押すと、それに対応したフォームが閉じられる。


サンプル・プログラムの実行時の画面
メイン・フォームで[フォーム作成]ボタンを押すと、番号の付けられた新しいフォームを作成する。リストボックスには現在開かれているフォームの一覧が表示する。リストボックスで項目を選択し、[閉じる]ボタンを押すと、それに対応したフォームを閉じる。

 リストボックスで表示しているフォームの一覧が、フォームのコレクション(OpenFormsプロパティ)の内容だ。

 このサンプル・プログラムを作成するには、Visual Studio 2005でWindowsアプリケーションのプロジェクトを新規作成し、まず次の画面のようにフォームに3つのコントロールを配置する。


3つのコントロールを配置したフォーム
1つのListBoxコントロールと2つのButtonコントロール([フォーム作成]ボタンと[閉じる]ボタン)を配置する。

 次にForm1.cs(あるいはForm1.vb)に以下のようなコードを書き込む。

using System;
using System.Windows.Forms;

namespace WindowsApplication2 {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
    }

    int number = 1;

    // メイン・フォームのLoadイベント・ハンドラ
    private void Form1_Load(object sender, EventArgs e) {
      refreshListBox(); // リストボックスの更新
    }

    // [フォーム作成]ボタンのClickイベント・ハンドラ
    private void button1_Click(object sender, EventArgs e) {
      Form f = new Form();
      f.Text = number.ToString(); // キャプションの設定
      f.Name = number.ToString(); // 名前の設定
      f.Show(); // フォームの表示
      number++;
      refreshListBox();
    }

    // [閉じる]ボタンのClickイベント・ハンドラ
    private void button2_Click(object sender, EventArgs e) {
      int index = listBox1.SelectedIndex;
      if (index == -1) {
        return; // 選択された項目なし
      }
      string name = listBox1.Items[index].ToString();
      Application.OpenForms[name].Close(); // フォームのクローズ
      refreshListBox();
    }

    // リストボックスにフォーム一覧を表示
    void refreshListBox() {
      listBox1.Items.Clear(); // リストボックスのクリア
      foreach (Form f in Application.OpenForms) {
        listBox1.Items.Add(f.Name); // フォーム名の追加
      }
    }
  }
}
Public Class Form1

  Dim number As Integer = 1

  ' メイン・フォームのLoadイベント・ハンドラ
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    refreshListBox() ' リストボックスの更新
  End Sub

  ' [フォーム作成]ボタンのClickイベント・ハンドラ
  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim f As New Form()
    f.Text = number.ToString() ' キャプションの設定
    f.Name = number.ToString() ' 名前の設定
    f.Show() ' フォームの表示
    number += 1
    refreshListBox()
  End Sub

  ' [閉じる]ボタンのClickイベント・ハンドラ
  Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim index As Integer = ListBox1.SelectedIndex
    If index = -1 Then
      Return ' 選択された項目なし
    End If
    Dim name As String = ListBox1.Items(index).ToString()
    Application.OpenForms(name).Close() ' フォームのクローズ
    refreshListBox()
  End Sub

  ' リストボックスにフォーム一覧を表示
  Sub refreshListBox()
    ListBox1.Items.Clear() ' リストボックスのクリア
    For Each f As Form In Application.OpenForms
      ListBox1.Items.Add(f.Name) ' フォーム名の追加
    Next
  End Sub
End Class
OpenFormsプロパティを利用したサンプル・プログラム(上:C#、下:VB)
Form1.cs(あるいはForm1.vb)の内容をこのプログラムに置き換える。C#版では3つのイベント・ハンドラを各コントロールに設定する必要がある。

 リストボックスにフォーム一覧を表示するのがrefreshListBoxメソッドだ。このメソッドは単純に、OpenFormsプロパティに含まれているフォームの名前をリストボックスに追加しているだけである。すでに述べたように、フォームをインスタンス化してShowメソッドにより表示したり、Closeメソッドを呼び出してフォームを閉じたりするだけで、OpenFormsプロパティの内容が自動的に更新されるのが分かるだろう。

 なおVisual Basic 2005では、My機能を使って「My.Application.OpenForms」と記述しても「Application.OpenForms」と意味は同じである。End of Article

利用可能バージョン:.NET Framework 2.0のみ
カテゴリ:Windowsフォーム 処理対象:ウィンドウ
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
使用ライブラリ:Applicationクラス(System.Windows.Forms名前空間)

この記事と関連性の高い別の.NET TIPS
各フォームの共通要素を基本フォームにまとめるには?
基本フォームから継承された内容を派生フォームでカスタマイズするには?
Windowsアプリケーションの位置やサイズを保存するには?
システムトレイ(タスクトレイ)にアイコンを表示するには?
システムトレイ(タスクトレイ)にアイコンを表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間