.NET TIPS

Windowsフォーム上のすべてのコントロールを列挙するには?

デジタルアドバンテージ
2004/10/29

 Windowsフォーム上に配置されているコントロールは、フォームのControlsプロパティからアクセスすることができる。

 しかし、PanelコントロールやGroupBoxコントロールなどを利用している場合には、フォームのControlsプロパティからすべてのコントロールにアクセスできるわけではない。なぜなら、Panelコントロールなどの、ほかのコントロールをグループ化できるコントロール(コンテナ・コントロールと呼ばれる)上に配置されたコントロールは、そのコンテナ・コントロールのControlsプロパティからしかアクセスできないためだ(Controlsプロパティは、すべてのコントロールの基本クラスであるControlクラス(System.Windows.Forms名前空間)で定義されている)。

 このため、フォーム上に配置されているすべてのコントロールを列挙するには、まずフォームのControlsプロパティに登録されている各コントロールにアクセスし、さらにそれぞれのコントロールのControlsプロパティにアクセスするといったことを繰り返す必要がある。この処理を行うメソッドを記述すると次のようになる。

public Control[] GetAllControls(Control top)
{
  ArrayList buf = new ArrayList();
  foreach (Control c in top.Controls)
  {
    buf.Add(c);
    buf.AddRange(GetAllControls(c));
  }
  return (Control[])buf.ToArray(typeof(Control));
}
すべてのコントロールを再帰的に取得するメソッド(C#)
 
Public Function GetAllControls(ByVal top As Control) As Control()
  Dim buf As ArrayList = New ArrayList
  For Each c As Control In top.Controls
    buf.Add(c)
    buf.AddRange(GetAllControls(c))
  Next
  Return CType(buf.ToArray(GetType(Control)), Control())
End Function
すべてのコントロールを再帰的に取得するメソッド(VB.NET)

 このメソッドは、パラメータで指定されたコントロールからスタートして、Controlsプロパティによるコントロールの親子階層を再帰的にたどって行き、すべてのコントロールをControl型の配列として返す。ArrayListクラス(System.Collections名前空間)のAddRangeメソッドは、配列やほかのArrayListオブジェクトの全要素を自分自身のインスタンスに追加するメソッドである。

 このGetAllControlsメソッドを利用したコード例を次に示す。このコードはVisual Studio .NETで作成したWindowsアプリケーションにおいて、Buttonコントロールのイベント・ハンドラとして記述した場合を想定している。コード中のthis(VB.NETではMe)はフォームを参照している。

private void button1_Click(object sender, System.EventArgs e)
{
  Control[] all = GetAllControls(this);
  foreach (Control c in all)
  {
    Console.WriteLine(c.Name);
  }
}
GetAllControlsメソッドの呼び出し例(C#)
 
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  Dim all As Control() = GetAllControls(Me)
  For Each c As Control In all
    Console.WriteLine(c.Name)
  Next
End Sub
GetAllControlsメソッドの呼び出し例(VB.NET)

 次のようなデザインのフォームに対して上記のコードを実行すると、下に示すような出力がVisual Studio .NETの[出力]ウィンドウに表示される。

PanelコントロールやGroupBoxコントロールを利用したフォーム
ブルーの部分がPanelコントロール。このPanelコントロールはフォームの子コントロールであるが、それに含まれるGroupBoxコントロールなどは、Panelコントロールの子コントロールである。また、GroupBoxコントロールは2つのRadioButtonコントロールを子コントロールとして持つ。
 
Panel1
Button2
TextBox1
DateTimePicker1
GroupBox1
RadioButton2
RadioButton1
StatusBar1
Button1
ListBox1
上記フォームに対するサンプル・コードの出力

 配列として取得した各コントロールがどの種類のコントロールかを調べるには、C#ではis演算子、VB.NETでは「TypeOf...Is式」を使えばよい。End of Article

カテゴリ:Windowsフォーム 処理対象:コントロール
カテゴリ:Windowsフォーム 処理対象:Panelコントロール
カテゴリ:Windowsフォーム 処理対象:GroupBoxコントロール
使用ライブラリ:Controlクラス(System.Windows.Forms名前空間)
 
この記事と関連性の高い別の.NET TIPS
Windowsフォーム上のコントロールを検索するには?
Windowsフォームでグループ化されたコントロールのタブ・オーダーを設定するには?
コントロールに対するキー入力をフォームで処理するには?
基本フォームから継承された内容を派生フォームでカスタマイズするには?
PictureBoxコントロール上に文字を表示するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム 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メールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH