VB6には、コントロールアレイと呼ばれる機能があります。この機能では、コントロールに同じ名前を付け、インデックス値を指定します。これにより、コントロールをループして各値を設定することにより、値を設定できます。 VB .NETでは、制御配列を作成できません。誰かが同様のソリューションを提供してくれる可能性があります。
これは私が他の何かのために書いたサンプルで、似たようなことをする方法とハンドラーをする方法も示しています。これにより、ボタンをクリックすると赤に変わる10x10グリッドのボタンが作成されます。
Dim IsCreated(99) As Boolean
Dim Buttons As New Dictionary(Of String, Button)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
For i As Integer = 0 To 99
Dim B As New Button
Me.Controls.Add(B)
B.Height = 30
B.Width = 40
B.Left = (i Mod 10) * 41
B.Top = (i \ 10) * 31
B.Text = Chr((i \ 10) + Asc("A")) & i Mod 10 + 1
Buttons.Add(B.Text, B)
B.Tag = i
AddHandler B.Click, AddressOf Button_Click
Next
End Sub
Private Sub Button_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Dim B As Button = sender
IsCreated(B.Tag) = True
B.BackColor = Color.Red
End Sub
提案された反復アプローチの使用は避けてください。フォームが非常に単純でない限り、コントロールのかなりランダムなコレクションが得られます。コードで制御配列を宣言し、フォームコンストラクターで初期化するだけです。このような:
Public Class Form1
Private OrderNumbers() As TextBox
Public Sub New()
InitializeComponent()
OrderNumbers = New TextBox() {TextBox1, TextBox2}
End Sub
End Class
これで、VB6の場合と同じようにOrderNumberを処理できます。
多分これはもっと簡単です。制御配列を作成するために、制御配列宣言をモジュールに配置します。たとえば、3つのTextBoxを持つフォームがあり、TextBoxを「mytext」というコントロール配列の一部にしたい場合、モジュールでコントロール配列を次のように宣言します。
Module Module1
Public mytext() As TextBox = {Form1.TextBox1, Form1.TextBox2, Form1.TextBox3}
End Module
そして、次のようにコントロール配列のTextBoxを使用します。
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
mytext(0).Text = "Hello"
mytext(1).Text = "Hi"
mytext(2).Text = "There"
End Sub
End Class
VB6の場合と同様に、コントロールアレイをループすることもできます。
Public Class Form1
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
For i As Integer = 0 To 2
mytext(i).Text = i + 1
Next
End Sub
End Class
モジュールを使用する利点は、TextBoxが同じ形式である必要がないことです。
Winformsを使用すると、次のことができます。
myForm.Controls _
.OfType(Of TextBox) _
.OrderBy(Function(c) c.Name) _
.Where(Function(c) c.Name.StartsWith("somePrefix")) _
.ToArray()
フォームでは、テキストボックスにsomePrefix1
、somePrefix2
などの名前を付けます。
これが oldの記事 ですが、より多くの情報が得られる可能性があります。一番上の方法はとても簡単です。
したがって、これはVB.NETに移行しなかった機能の1つです-正確に:ただし、.NETの2つの異なるメカニズムを使用してVB6で行ったであろうことの多くを達成できます:コントロールコレクションのループ制御イベントの処理。
---(コントロールコレクションをループする
VB.NETでは、すべてのフォームとコントロールコンテナにコントロールコレクションがあります。これは、ループして、値を設定するなどの操作をコントロールで実行できるコレクションです。
Dim myTxt As TextBox
For Each ctl As Control In Me.Controls
If TypeOf ctl Is TextBox Then
myTxt = CType(ctl, TextBox)
myTxt.Text = "something"
End If
Next
このコードサンプルでは、返されたオブジェクトのタイプをテストするコントロールコレクションを繰り返し処理します。テキストボックスを見つけたら、それをテキストボックスにキャストしてから、それを使って何かをします。
制御イベントの処理
VB6のコントロール配列を使用する場合と同様に、1つのイベントハンドラーで複数のコントロールのイベントを処理することもできます。これを行うには、Handlesキーワードを使用します。
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged, TextBox2.TextChanged, TextBox3.TextChanged
Dim myTxt As TextBox = CType(sender, TextBox)
MessageBox.Show(myTxt.Text)
End Sub
ここで重要なのは、イベントハンドラーの最後にあるHandlesキーワードです。処理するさまざまなコントロールとイベントは、コンマを使用して区切ります。同じイベント宣言を持つコントロールを処理していることを確認してください。 senderがすべてのイベントで何のためにあるのか疑問に思ったことがあるなら、ここにその使用法の1つがあります。使用しているコントロールのタイプにsender引数をキャストし、それをローカル変数に割り当てます。これで、配列にインデックスを付けて指定した場合と同じように、VB6でイベントを発生させたコントロールにアクセスして操作できるようになります。
これらの2つの手法を使用すると、VB6でコントロールアレイの機能を複製できます。幸運を。
フォーム、PanelControl、または子コントロールを含むことができるその他のものには、Controls
というプロパティがあります。
を使用して、コントロール内のすべてのテキストボックスをループできます。
'配列のようにTextBoxのリストを作成しますが、myTextBoxControlsを新しいリストとして薄暗くします
For Each uxControl As UserControl in MyFormName.Controls
If TypeOf(uControl) is TextBox
myTextBoxControls.Add(uControl)
End IF
Next
これで、反復可能なコレクションを操作できます。
EditValue
プロパティを使用してTextBoxes値にアクセスできます。
あなたがもう少しやろうとしていることを見た後。
おそらく、すべてのコントロールにプレフィックスを付けて名前を付けたいと思うでしょう。今のところabc
としましょう。
For Each uxControl As UserControl in MyFormName.Controls
If TypeOf(uControl) is TextBox Then
Dim tbControl As TextBox = DirectCast(uControl, TextBox)
If tbControl.Name.StartsWith("abc") Then
tbControl.EditValue = "the Value you want to initialize"
End If
End If
Next
Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click
Dim a() As Control = GetControls("textbox")
For Each c As TextBox In a
c.Text = c.Name
Next
End Sub
Private Function GetControls(typeOfControl As String) As Control()
Dim allControls As New List(Of Control)
'this loop will get all the controls on the form
'no matter what the level of container nesting
'thanks to jmcilhinney at vbforums
Dim ctl As Control = Me.GetNextControl(Me, True)
Do Until ctl Is Nothing
allControls.Add(ctl)
ctl = Me.GetNextControl(ctl, True)
Loop
'now return the controls you want
Return allControls.OrderBy(Function(c) c.Name). _
Where( _
Function(c) (c.GetType.ToString.ToLower.Contains(typeOfControl.ToLower) AndAlso _
c.Name.Contains("Box")) _
).ToArray()
End Function