フォーム上にある同じ種類のコントロールを配列に入れて、 昔のVisualBasicの様にコントロール配列的に処理したいことはよくあります。 そこで今回は、フォーム上に設置した5個の TextBox と Button を配列に入れて処理を行う方法を示します。
以下の画像は、今回のフォームを実行した場合の表示で、Button4 を押下した時の様子です。
以下のソースは、フォームロード時に「コントロール配列」に TextBox1~5 及び Button1~5 を設定し 各ボタンのクリックイベントの処理関数を AddHandler で設定しています。
ボタンのクリックイベントではイベント発生が在ったオブジェクト sender がどのボタンに該当するのかの 配列の指標を取得します。 その指標を使って、TextBox と Button のプロパティにアクセスし、そのデータを表示しています。
コントロールを配列で処理する方法
Public Class frmCtrlIdx 'TextBoxコントロールの配列 Private ArrTextBox() As TextBox 'Buttonコントロールの配列 Private ArrButton() As Button '''''' フォームロードイベント ''' Private Sub frmCtrlIdx_Load(sender As Object, e As EventArgs) Handles Me.Load 'コントロール配列に各コントロールを設定 ArrTextBox = {Me.TextBox1, Me.TextBox2, Me.TextBox3, Me.TextBox4, Me.TextBox5} ArrButton = {Me.Button1, Me.Button2, Me.Button3, Me.Button4, Me.Button5} 'ボタンコントロールのクリックイベント処理を定義 For Each btn As Button In ArrButton AddHandler btn.Click, AddressOf ButtonClick Next End Sub '''''' ボタンクリックイベント ''' Private Sub ButtonClick(ByVal sender As Object, ByVal e As System.EventArgs) For i As Integer = 0 To UBound(ArrButton) 'ボタンがどのボタンに該当するかチェック(指標を取得する) If sender Is ArrButton(i) Then 'テキストボックスの入力値を取得 Dim strTextBox As String = ArrTextBox(i).Text 'ボタンのCaptionを取得 Dim strTitle As String = DirectCast(sender, Button).Text '表示 MsgBox(strTextBox, MsgBoxStyle.OkOnly, strTitle) End If Next End Sub '''''' フォームClosedイベント ''' Private Sub frmCtrlIdx_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed 'コントロール配列の廃棄 Erase ArrButton Erase ArrTextBox End Sub End Class
上の方法では、クリックイベントで sender がどのボタンに該当するかをコントロールを配列から探していますが、 ボタンのコントロール名の最後の数字と、テキストボックスのコントロール名の最後の数字が同じものにしていますので、 テキストボックスのコントロール名をフォーム上から探すことで同じことができます。
フォーム上に存在するコントロールを名前で探すには ControlCollection.Find メソッドを使用します。
以下にクリックイベントの部分のソースを示します。
フォーム上のコントロールを名前で探す方法
'''''' ボタンクリックイベント ''' 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 'テキストボックスのオブジェクト名 Dim strTextBoxName As String = "TextBox" & strTitleIdx 'フォーム上のテキストボックスを探す(結果が配列で返ってくる) Dim arrCtrl() As Control = Me.Controls.Find(strTextBoxName, False) If arrCtrl.Length > 0 Then 'テキストボックスの入力値を取得 Dim strTextBox As String = DirectCast(arrCtrl(0), TextBox).Text 'ボタンのCaptionを取得 Dim strTitle As String = DirectCast(sender, Button).Text '表示 MsgBox(strTextBox, MsgBoxStyle.OkOnly, strTitle) End If End If End Sub
関連する記事
⇒コレクション「List」をコントロール配列の様に使う方法⇒フォーム上のコントロールのイベント処理の一括関連付け:[AddHandler,DirectCast]
⇒コントロールの同じイベント処理に複数の関連付けをテスト:[AddHandler,DirectCast]
⇒配列の使い方について(Dim, Redim)
⇒配列の使い方の注意点について(コピー, Clone)
⇒配列の範囲指定によるコピー(Array.Copy, Skip, Take)
PR
コメント