忍者ブログ

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

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

コレクション「List」をコントロール配列の様に使う方法

フォーム上にある同じ種類のコントロールを配列に入れて処理する方法は以下の記事で紹介しましたが、 今回はそれをコレクションクラスの 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

下図はチェックの反転の様子です。


ListForEach メソッドを使う方法は以下の通りです。

ListForEach メソッドを使う方法

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 への変換について











PR

コメント

コメントを書く