検索
連載

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

Share
Tweet
LINE
Hatena
「.NET TIPS」のインデックス

連載目次

 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式」を使えばよい。

カテゴリ:Windowsフォーム 処理対象:コントロール
カテゴリ:Windowsフォーム 処理対象:Panelコントロール
カテゴリ:Windowsフォーム 処理対象:GroupBoxコントロール
使用ライブラリ:Controlクラス(System.Windows.Forms名前空間)

「.NET TIPS」のインデックス

.NET TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る