[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。
フォーム上にある同じ種類のコントロールを配列に入れて処理する方法は以下の記事で紹介しましたが、 今回はそれをコレクションクラスの 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 への変換について
コメント