VB.NET で VB6 のコントロール配列のようなものを実装する

VB6 では、ボタンやテキストボックスなどのコントロールを簡単に配列にできましたが、VB.NET で同じことをしようとすると少し面倒です。

[adsense1]

例えばフォーム上にボタンが5つあったとします。

vbnet-control-array01

VB6 では

VB6 では、引数に[Index]があるのでイベントの処理も簡単でした。

Private Sub Command1_Click(Index As Integer)
    MsgBox (Command1(Index).Caption & "をクリック!")
End Sub

VB.NET では

VB.NET には、VB6 と同様の引数が存在しません。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    MessageBox.Show(Button1.Name & "をクリック!")

End Sub

上の VB6 のコードと同様の処理をする場合は、これに下のコードの黄色の部分を追加すれば OK です。
DirectCast(sender, Button) は、クリックされたボタンになります。
※Button1_Click というところは任意の名前で良いです。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click, Button5.Click

    MessageBox.Show(DirectCast(sender, Button).Name & "をクリック!")

End Sub

For 文などで繰り返し処理する

VB6 でよく使用するのが以下のようなコードだと思います。

For i = 1 To 5
    Text1(i).Text = i
Next i

VB.NET でも、方法は色いろあるのですが、ここではコントロール名の一部を連番にする方法を紹介します。
テキストボックスの名前を TextBox1・TextBox2・TextBox3・TextBox4・TextBox5 とします。

For i = 1 To 5
    CType(Me.Controls("TextBox" & i), TextBox).Text = i.ToString
Next i

Panel や GroupBox などの中にテキストボックスが入っている場合は、それが親コントロールになるので注意してください。

CType(Me.Panel1.Controls("TextBox" & i), TextBox).Text = i.ToString
CType(Me.GroupBox1.Controls("TextBox" & i), TextBox).Text = i.ToString

2013年9月19日追記

上の方法は、親コントロール名を指定しなければならないので管理が大変です。
最近は以下のようにしています。

Private txt As New List(Of TextBox)

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    txt.Add(TextBox1)
    txt.Add(TextBox2)
    txt.Add(TextBox3)
    txt.Add(TextBox4)
    txt.Add(TextBox5)

    For i As Integer = 0 To txt.Count - 1
        txt(i).Text = (i + 1).ToString
    Next i

End Sub

[adsense2]

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください