VB.NET Tips - コントロールのTagプロパティを各種のデータ退避として使用

VB.NETの標準コントロールには Tag プロパティがあります。 このプロパティは Form Button TextBox など全ての標準コントロールには存在します。 (標準コントロールは System.Windows.Forms.Control から派生しているので当然なのですが) このプロパティを各種のデータの退避領域として使うのが今回の目的です。

VB.NETの「オブジェクト ブラウザ」で Tag 定義を見てみると以下の様になっています。

Tag プロパティについて

Public Property Tag As Object
     System.Windows.Forms.Control のメンバー
概要:
     コントロールに関するデータを格納するオブジェクトを取得または設定します。
戻り値:
     コントロールに関するデータを格納している System.Object。既定値は null です。
Tag プロパティの型は System.Object なのでどんな型のデータを設定しても良いということです。 つまり、Integer型等の数値だったり、Stringだったり、はたまたクラスでもOKです。

今回の例としては、クラスデータを Tag に設定することを行います。 以下のソースをご覧ください。
1個のフォームの中にクラス宣言を行っています。 そのクラスをフォームロードイベントで、2個のボタンの Tag に別々のクラスデータを設定します。 また、ボタンのクリック時にそのクラスのメソッドを呼び出しています。

コントロールのTagプロパティを各種のデータ退避として使用(クラスデータ)

Public Class frmTagTest

    ''' 
    ''' テストクラス
    ''' 
    Class ClsTagTest
        Private strTest As String    '文字列データ
        Private intTest As Integer   '整数データ

        ''' 
        ''' コンストラクタ
        ''' 
        ''' 設定文字列</param>
        ''' 設定整数</param>
        Sub New(ByVal astrTest As String, ByVal aintTest As Integer)
            '設定値を退避する
            Me.strTest = astrTest
            Me.intTest = aintTest
        End Sub

        ''' 
        ''' 表示テストメソッド
        ''' 
        Public Sub TestDisp()
            Dim str As String = "strTest : " & Me.strTest & vbCrLf & _
                                "intTest : " & Me.intTest.ToString
            MsgBox(str)
        End Sub
    End Class

    ''' 
    ''' フォームロード時に各ボタンのタグにクラスデータの設定
    ''' 
    Private Sub frmTagTest_Load(sender As Object, e As EventArgs) Handles Me.Load
        '[Button1]のタグにクラスデータ設定
        Dim tagTest1 As New ClsTagTest("Test-aaa", 100)
        Me.Button1.Tag = tagTest1

        '[Button2]のタグにクラスデータ設定
        Dim tagTest2 As New ClsTagTest("Test-bbb", 200)
        Me.Button2.Tag = tagTest2
    End Sub

    ''' 
    ''' ボタンクリックイベント(Handles以降に複数のイベントを記述)
    ''' 
    Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
        'ボタンに設定されたクラスを取得
        Dim tagTest As ClsTagTest = DirectCast(sender, Button).Tag
        'クラスのメソッドを呼び出す
        Call tagTest.TestDisp()
    End Sub

End Class

これは初心者の方向けですが、上記のソースの中での注意点としては、 ボタンクリックのイベントを1カ所に集めて処理する様に、 Handles の所で複数のボタンクリック宣言を行っています。

あともう一つ注意点なのですが、Tag プロパティの初期値は null であることです。 何も設定しない状態で Tag を参照しても結果は何も入っていない状態ですので、 プログラム的には IsNothing か何かで判定して処理を分ける必要があります。