■ コントロール配列

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