「コントロール配列−その2」
Windowアプリ(VB.NET)ではどうやって実現するか調べてみた。
そして、@ITの「Windowsフォーム上のすべてのコントロールを列挙するには?」を使うことで実現できることがわかった。
サンプルとして取り上げたのは、起動時に全てのTextBoxのTextプロパティを初期化し、Labelコントロールの中でもBorderStyleがFixed3Dのものだけを初期化するというものである。
まず、@ITのサンプルにある「すべてのコントロールを再帰的に取得するメソッド」を汎用モジュールとする。これはForm上の全てコントロールを一つの配列に取り込むものである。
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
次にTextプロパティの初期化ルーチン[ControlInit]を次のようにする。
ここでは、取得した全てのコントロールから目的のTextBoxとLabelをTypeOf ... Is 式を使って判定している。もし、コントロール名を知りたければ、nameプロパティを使うとTextBoxやLabelの個別名がわかる。
Private Sub ControlInit()
Dim AllCtrl As Control() = GetAllControls(Me)
For Each c As Control In AllCtrl
If TypeOf c Is TextBox Then
'TextBoxだったら
c.Text = "" 'TextBoxの初期化
ElseIf TypeOf c Is Label Then
'Labelだったら
Dim lb As Label
'(注) c のままではBorderStyleにアクセスできない
lb = CType(c, Label)
If lb.BorderStyle = BorderStyle.Fixed3D Then
'BordeStyleがFixed3Dだったら
lb.Text = "" 'Labelの初期化
End If
End If
Next
End Sub
後はこれをForm_Loadイベントで実行すればよい。