フォーム上にある同じ種類のコントロールを配列に入れて処理する方法は以下の記事で紹介しましたが、 今回はそれをコレクションクラスの List で行ってみます。
⇒コントロールを配列で処理する方法 :[AddHandler,DirectCast]
以下の画像は、今回のフォームを実行した場合の表示で、Button3 を押下した時の様子です。
以下のソースは、フォームロード時に「コントロール配列」に TextBox1~5 及び Button1~5 を設定し 各ボタンのクリックイベントの処理関数を AddHandler で設定しています。
ボタンのクリックイベントではイベント発生が在ったオブジェクト sender がどのボタンに該当するのかの配列の指標を取得します。 その指標を使って、テキストボックスを List から取得しそのデータを表示しています。
■コントロールを List で処理する方法
Public Class frmCtrlList
'TextBoxコントロールのList
Private ListTextBox As List(Of TextBox)
'ButtonコントロールのList
Private ListButton As List(Of Button)
' フォームロードイベント
Private Sub frmCtrlList_Load(sender As Object, e As EventArgs) Handles Me.Load
'コントロールListに各コントロールを設定
ListTextBox = New List(Of TextBox) From {Me.TextBox1, Me.TextBox2, Me.TextBox3, Me.TextBox4, Me.TextBox5}
ListButton = New List(Of Button) From {Me.Button1, Me.Button2, Me.Button3, Me.Button4, Me.Button5}
'ボタンコントロールのクリックイベント処理を定義
For Each btn As Button In ListButton
AddHandler btn.Click, AddressOf ButtonClick
Next
End Sub
' ボタンクリックイベント
Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs)
'ボタンのオブジェクト名から指標文字列を取得(Nameが[ButtonNN]の形式が前提)
Dim strTitleIdx As String = DirectCast(sender, Button).Name.Replace("Button", "")
'指標が数値??
If IsNumeric(strTitleIdx) = True Then
'テキストボックスをListから取得
Dim TextBox As TextBox = ListTextBox.Item(CInt(strTitleIdx) - 1)
'テキストボックスの入力値を取得
Dim strTextBox As String = TextBox.Text
'ボタンのCaptionを取得
Dim strTitle As String = DirectCast(sender, Button).Text
'表示
MsgBox(strTextBox, MsgBoxStyle.OkOnly, strTitle)
End If
End Sub
' フォームClosedイベント
Private Sub frmCtrlList_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
'コントロールListの廃棄
ListButton.Clear()
ListButton = Nothing
ListTextBox.Clear()
ListTextBox = Nothing
End Sub
End Class
更に、チェックボックスを List を使って制御する例を示します。
フォームロード時にチェックボックスを List を生成し、ボタンをクリックした時にチェックボックスのチェックを反転処理しています。 チェックボックスの繰り返し処理は For Each文 で行っています。
■チェックボックスを List を使って制御
Public Class frmCtrlList2
' CheckBox の Listの宣言
Private list As List(Of CheckBox)
Private Sub frmCtrlList2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Listの生成(初期化)
list = New List(Of CheckBox) From {Me.CheckBox1, Me.CheckBox2, Me.CheckBox3}
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' For Each文でのチェックボックス処理
For Each chk As CheckBox In list
chk.Checked = Not chk.Checked 'チェック状態反転
Next
End Sub
End Class
下図はチェックの反転の様子です。
尚 List の ForEach メソッドを使う方法は以下の通りです。
■List の ForEach メソッドを使う方法
Public Class frmCtrlList2
' CheckBox の Listの宣言
Private list As List(Of CheckBox)
Private Sub frmCtrlList2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' Listの生成(初期化)
list = New List(Of CheckBox) From {Me.CheckBox1, Me.CheckBox2, Me.CheckBox3}
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
' ForEachメソッドで匿名メソッドを宣言して処理する
list.ForEach(Sub(chk)
chk.Checked = Not chk.Checked
Console.WriteLine("Name[{0}]...Checked:{1}", chk.Name, chk.Checked)
End Sub)
' 1行の処理ならば以下の方法でもOK
'list.ForEach(Sub(chk) chk.Checked = Not chk.Checked)
End Sub
End Class
上記の匿名メソッドの宣言方法では、メソッドの名前を宣言せずに、通常の Sub を宣言する様にします。 (複数行の処理を行う場合を示しています)
コメント行で記述した方法でもOKです。簡単に1行で済ます場合には有効ですが、パッと見た感じでは分かりにくいですが。 (匿名メソッドはJavascriptなどではよく出てきます)
関連する記事
⇒コントロールを配列で処理する方法 :[AddHandler,DirectCast]⇒コレクション「List」の使い方について
⇒コレクション「List」と配列の相互変換について
⇒コレクション「Dictionary」の使い方について
⇒コレクション「Dictionary」から配列及び List への変換について
コメント