VB.NET ではコントロール配列が廃止になりました
困ったと特に思うのは VB6 からアップグレードするような人だと思います
VB の互換ライブラリを利用すれば コントロール配列は実現できるようですが いろいろと調べた結果では使わない方がよさそうです
ということで 互換ライブラリを使わずにコントロールを配列として利用する方法を 2つ説明します
@ コントロールを格納する配列を作成する方法
まずは コントロールを格納する配列を作成します
Private cmdxxx(n) As System.Windows.Forms.Button
フォームロード時に実際の画面のコントロールを作成した配列に格納します
また 配列に格納した全コントロールから同じイベントが呼び出されるようにします
Private Sub Form1_Load(ByVal eventSender As System.Object, _
ByVal eventArgs As System.EventArgs) Handle MyBase.Load
Dim i As Integer
cmdxxx(0) = cmdxxx1
cmdxxx(1) = cmdxxx2
:
cmdxxx(n) = cmdxxxm
For i = 0 To n
AddHandler cmdxxx(i).Click, AddressOf cmdxxx_Click
Next i
End Sub
イベントではコントロールの配列番号を取得します
下記の例では 受け取ったコントロールのオブジェクトとコントロールの配列を比較して一致するインデックスを配列番号とするクラス
メンバ関数を作成しています
Private Sub cmdxxx_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Dim Index As Integer = CtrlArr.GetIndex(sender, cmdxxx) Select Case Index Case 0 ・・・ Case n Me.Close() End Select End Sub Public Class CtrlArr Public Shared Function GetIndex(ByVal sender As System.Object, _ ByVal objCtrl() As System.Object) As Integer Dim i As Integer For i = 0 To UBound(objCtrl) If sender Is objCtrl(i) Then Return i End If Next Return i End Function End Class
簡易的に行う場合には コントロールの Tag プロパティを利用したり コントロール名の最終位置を利用する方法もあります
Dim Index As Integer = CInt(sender.Tag)
上記で作成したイベントをコード内から呼び出す場合には 下記のように記述します
cmdxxx(0).PerformClick()
A インデックスで指定したコントロールを返す関数を作成する方法
まずは インデックスで指定したコントロールを返す関数を作成します
Private ReadOnly Property cmdxxx(ByVal Index As Integer) As System.Windows.Forms.Button Get Select Case Index Case 0 : cmdxxx = cmdxxx1 Case 1 : cmdxxx = cmdxxx2 Case 2 : cmdxxx = cmdxxx3 End Select End Get End Property
各コントロールのイベントはインデックスをつけて配列用のプロシージャを呼び出します
※ イベントが多くなりすぎるので嫌という場合には この後で説明するソースで置き換えが可能です
Private Sub cmdxxx1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmdxxx1.Click Call cmdxxx_Click(0, sender, e) End Sub Private Sub cmdxxx2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmdxxx2.Click Call cmdxxx_Click(1, sender, e) End Sub Private Sub cmdxxx3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmdxxx3.Click Call cmdxxx_Click(2, sender, e) End Sub Private Sub cmdxxx_Click(ByVal Index As Integer, ByVal sender As System.Object, _ ByVal e As System.EventArgs) Select Case Index Case 0 ・・・ Case n Me.Close() End Select End Sub
イベントの数が多い場合など 呼び出すイベントは 1つにしたい場合は同じイベントが実行されるようにして Tag プロパティなどを元
にインデックスを取得する方法も考えられます
Private Sub cmdxxx_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles cmdxxx1.Click, cmdxxx2.Click, cmdxxx3.Click Dim Index As Integer = CInt(DirectCast(sender, System.Windows.Forms.Button).Tag) Select Case Index Case 0 ・・・ Case n Me.Close() End Select End Sub