【VB.NET】ControlCollectionなどからコントロール配列の「添え字」を取得したい

タグの編集
投稿者 yukihiro  (社会人) 投稿日時 2015/12/8 00:18:04
こんばんは、はじめまして。
早速ですが、

環境:

Win7+VisualStudio2013

目的:

前提としてVB6.0のコードを.NET4.5化したいというお題があり、
VB6で使用されていた、ボタンコントロールなどの配列に似た機能を使用したいと思っています。
(アップグレードマネージャーでVB6のコードをアップグレードした所、BaseOCXArrayは継承できな作りになっており使用できないとのメッセージが表示されたため)

ここでやりたい事は
Senderなどで送られたオブジェクトを使用して
VB6で言うコントロール配列の「添え字」を取得したいです。

コレクションを使用して試しにコードを書いてみたのですが、上手くいきません。
もし、分かる方がいらっしゃるのでしたら、教えて頂きたいです。

(最悪、Button1、Button2のイベントハンドラからそれぞれ「0」とか「1」とかの引数を付加して関数に飛ばせばいいのですが、
コレクションや配列を使用して、コードが書けるならばその方が良いと思い、投稿させていただきました。

書いてみたコード:

(Button1, Bottun2, Label1は、Visualstudioのデザイナーを使用し、Form1上に配置しています)

Public Class Form1

    Public cltCollection As System.Windows.Forms.Control.ControlCollection

    'フォームのロード
    'ボタンコントロールを格納するコレクションの作成
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Me.cltCollection = New System.Windows.Forms.Control.ControlCollection(Me)
        cltCollection.Add(Button1)
        cltCollection.Add(Button2)
        AddHandler Button1.Click, AddressOf buttons_Click
        AddHandler Button2.Click, AddressOf buttons_Click

    End Sub

    '各ボタンが押された時のイベント
    '可能ならこの中で添え字を取得したい
    Private Sub buttons_Click(sender As Object, e As EventArgs)
        Dim index As Integer
        index = cltCollection.IndexOf(sender)
        index = cltCollection.

        Label1.Text = "クリックされたボタン = " & index.ToString & "です"
        'この場合、「0」や「1」ではなく「-1」が表示される

    End Sub

End Class



以上、散文で申し訳ありませんが、よろしくお願いいたします。

投稿者 yukih  (社会人) 投稿日時 2015/12/8 01:42:11
自己解決したため、そのコードを以下に記入します

※結論から言うと「ControlCollection」を使うのではなく「ArrayList」を使うだけでよかったです。

書いてみたコード:

 (Button1, Bottun2, Label1は、Visualstudioのデザイナーを使用し、Form1上に配置しています)

Public Class Form1

     Public aryBtns As System.Collections.ArrayList

     'フォームのロード
    'ボタンコントロールを格納するコレクションの作成
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

         Me.aryBtns = New System.Collections.ArrayList
         aryBtns.Add(Button1)
         aryBtns.Add(Button2)
         AddHandler Button1.Click, AddressOf buttons_Click
         AddHandler Button2.Click, AddressOf buttons_Click

     End Sub

     '各ボタンが押された時のイベント
    '可能ならこの中で添え字を取得したい
    Private Sub buttons_Click(sender As Object, e As EventArgs)
         Dim index As Integer
         index = aryBtns.IndexOf(sender)

         Label1.Text = "クリックされたボタン = " & index.ToString & "です"
    End Sub

 End Class

お騒がせいたしまして失礼いたしました・・・
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/12/8 09:20:05
> Public aryBtns As System.Collections.ArrayList
VB2005 以降では、ArrayList の出番は殆んどなくなりました。

Button を管理するなら、 
  Public buttons As New List(Of Button)()
のように、List(Of ) 型を使った方が、使い勝手が良いと思います。


Button 以外のコントロールもまとめて管理するなら、
  Public controls As New As List(Of Control)
とか。