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プロパティを各種のデータ退避として使用(クラスデータ)

01Public Class frmTagTest
02 
03    ''' <summary>
04    ''' テストクラス
05    ''' </summary>
06    Class ClsTagTest
07        Private strTest As String    '文字列データ
08        Private intTest As Integer   '整数データ
09 
10        ''' <summary>
11        ''' コンストラクタ
12        ''' </summary>
13        ''' <param name="astrTest">設定文字列</param>
14        ''' <param name="aintTest">設定整数</param>
15        Sub New(ByVal astrTest As String, ByVal aintTest As Integer)
16            '設定値を退避する
17            Me.strTest = astrTest
18            Me.intTest = aintTest
19        End Sub
20 
21        ''' <summary>
22        ''' 表示テストメソッド
23        ''' </summary>
24        Public Sub TestDisp()
25            Dim str As String = "strTest : " & Me.strTest & vbCrLf & _
26                                "intTest : " & Me.intTest.ToString
27            MsgBox(str)
28        End Sub
29    End Class
30 
31    ''' <summary>
32    ''' フォームロード時に各ボタンのタグにクラスデータの設定
33    ''' </summary>
34    Private Sub frmTagTest_Load(sender As Object, e As EventArgs) Handles Me.Load
35        '[Button1]のタグにクラスデータ設定
36        Dim tagTest1 As New ClsTagTest("Test-aaa", 100)
37        Me.Button1.Tag = tagTest1
38 
39        '[Button2]のタグにクラスデータ設定
40        Dim tagTest2 As New ClsTagTest("Test-bbb", 200)
41        Me.Button2.Tag = tagTest2
42    End Sub
43 
44    ''' <summary>
45    ''' ボタンクリックイベント(Handles以降に複数のイベントを記述)
46    ''' </summary>
47    Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
48        'ボタンに設定されたクラスを取得
49        Dim tagTest As ClsTagTest = DirectCast(sender, Button).Tag
50        'クラスのメソッドを呼び出す
51        Call tagTest.TestDisp()
52    End Sub
53 
54End Class

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

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

総アクセス数