【VB.NET】ControlCollectionなどからコントロール配列の「添え字」を取得したい
投稿者 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
お騒がせいたしまして失礼いたしました・・・
※結論から言うと「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)
とか。
VB2005 以降では、ArrayList の出番は殆んどなくなりました。
Button を管理するなら、
Public buttons As New List(Of Button)()
のように、List(Of ) 型を使った方が、使い勝手が良いと思います。
Button 以外のコントロールもまとめて管理するなら、
Public controls As New As List(Of Control)
とか。
早速ですが、
環境:
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
以上、散文で申し訳ありませんが、よろしくお願いいたします。