.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フォーム上のコントロールを検索するには?
[ASP.NET]DataGridコントロールのページ移動ボタンをカスタマイズするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH