web-dev-qa-db-ja.com

VB。NETでコントロールアレイを作成する方法

VB6には、コントロールアレイと呼ばれる機能があります。この機能では、コントロールに同じ名前を付け、インデックス値を指定します。これにより、コントロールをループして各値を設定することにより、値を設定できます。 VB .NETでは、制御配列を作成できません。誰かが同様のソリューションを提供してくれる可能性があります。

10
vijay

これは私が他の何かのために書いたサンプルで、似たようなことをする方法とハンドラーをする方法も示しています。これにより、ボタンをクリックすると赤に変わる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
13
dwidel

提案された反復アプローチの使用は避けてください。フォームが非常に単純でない限り、コントロールのかなりランダムなコレクションが得られます。コードで制御配列を宣言し、フォームコンストラクターで初期化するだけです。このような:

Public Class Form1
    Private OrderNumbers() As TextBox

    Public Sub New()
        InitializeComponent()
        OrderNumbers = New TextBox() {TextBox1, TextBox2}
    End Sub
End Class

これで、VB6の場合と同じようにOrderNumberを処理できます。

9
Hans Passant

多分これはもっと簡単です。制御配列を作成するために、制御配列宣言をモジュールに配置します。たとえば、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が同じ形式である必要がないことです。

3
hafiz

Winformsを使用すると、次のことができます。

myForm.Controls _
  .OfType(Of TextBox) _
  .OrderBy(Function(c) c.Name) _
  .Where(Function(c) c.Name.StartsWith("somePrefix")) _
  .ToArray()

フォームでは、テキストボックスにsomePrefix1somePrefix2などの名前を付けます。

これが oldの記事 ですが、より多くの情報が得られる可能性があります。一番上の方法はとても簡単です。

1
Daniel A. White

したがって、これは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でコントロールアレイの機能を複製できます。幸運を。

1
Steve Massing

フォーム、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
1
msarchet
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
0
dbasnett