【VB.NET】 グループ内にあるコントロールの初期化
VB.NETで、画面デザインを凝ったがために、コントロールの数が死ぬほど多くなったりすることがままありますが、これらの入力欄を初期化(消去)する際に、

TextBox1.Text = ""
TextBox2.Text = ""
TextBox3.Text = ""
 :

と記述していこうものなら、日が暮れてしまいます。おまけに途中でコントロールを追加しようものなら、忘れずに追加するようにしないと、1つだけ初期化されない、なんて事態に。

 で、極力手間を回避するために、

    Private Sub ClearState()
For Each ctl In TabPage1.Controls
If ctl.GetType Is GetType(TextBox) Then
ctl.Text = ""
ElseIf ctl.GetType Is GetType(RadioButton) Then
ctl.checked = False
ElseIf ctl.GetType Is GetType(CheckBox) Then
ctl.checked = False
ElseIf ctl.GetType Is GetType(NumericUpDown) Then
ctl.value = 0
ElseIf ctl.GetType Is GetType(ComboBox) Then
ctl.Text = "(選択してください...)"
End If
Next
End Sub

と、For Eachを使って全てのコントロールを初期化しようとしたら、幾つかが動きませんでした。

???

よくみると、初期化できていないコントロールは、GroupBoxの中に存在していたのです。
そういうことね。

というわけで、GroupBox内のコントロールまで初期化するためには、下記のようにコードを書いてあげる必要があります。

    Private Sub ClearState(ByVal obj As Object)
Dim ctl As Object
For Each ctl In obj.Controls
If ctl.GetType Is GetType(TextBox) Then
ctl.Text = ""
ElseIf ctl.GetType Is GetType(RadioButton) Then
ctl.checked = False
ElseIf ctl.GetType Is GetType(CheckBox) Then
ctl.checked = False
ElseIf ctl.GetType Is GetType(NumericUpDown) Then
ctl.value = 0
ElseIf ctl.GetType Is GetType(ComboBox) Then
ctl.Text = "(選択してください...)"
ElseIf ctl.GetType Is GetType(GroupBox) Then
ClearState(ctl)
End If
Next
End Sub

と、引数としてコントロール(オブジェクト)を指定できるようにし、If文の中に次の2行を入れます。これで「GroupBoxなんとか」を引数にして、同じ処理をもう一度させることができるのですね。こういうの、確か再帰、っていうんだっけ。

ElseIf ctl.GetType Is GetType(GroupBox) Then
 ClearState(ctl)

で、これを呼び出すときに、
ClearState(TabPage1)
としてあげれば、ちゃんと動きました。

自分が設置したグループ化されるコントロールが別にあれば、この2行をコントロール毎に追加すればイケルのではないかと思います。
[PR]
by hidemite | 2010-03-05 17:53 | PC
<< 【瓶】 にんにくおろし 【昭和】 大好き >>