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));
}
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
このメソッドは、パラメータで指定されたコントロールからスタートして、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);
}
}
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
次のようなデザインのフォームに対して上記のコードを実行すると、下に示すような出力が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名前空間)
Copyright© Digital Advantage Corp. All Rights Reserved.