忍者ブログ

VB.NET-TIPS などプログラミングについて

VB.NETのTIPS(小技集)を中心に、Javascript、PHP その他のプログラミングについて少し役に立つ情報を発信します。いわゆる個人的な忘備録ですが、みなさんのお役に立てれば幸いです。

コントロールを配列で処理する方法

フォーム上にある同じ種類のコントロールを配列に入れて、 昔のVisualBasicの様にコントロール配列的に処理したいことはよくあります。 そこで今回は、フォーム上に設置した5個の TextBoxButton を配列に入れて処理を行う方法を示します。

以下の画像は、今回のフォームを実行した場合の表示で、Button4 を押下した時の様子です。


以下のソースは、フォームロード時に「コントロール配列」に TextBox1~5 及び Button1~5 を設定し 各ボタンのクリックイベントの処理関数を AddHandler で設定しています。

ボタンのクリックイベントではイベント発生が在ったオブジェクト sender がどのボタンに該当するのかの 配列の指標を取得します。 その指標を使って、TextBoxButton のプロパティにアクセスし、そのデータを表示しています。

コントロールを配列で処理する方法

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

コメント

コメントを書く