Как создать массивы управления в VB .NET - PullRequest
10 голосов
/ 14 марта 2011

В VB6 есть функция, называемая массивами управления, в которой вы называете элементы управления одинаковыми именами и предоставляете им значение индекса. Это позволяет вам установить значение, просматривая элементы управления и устанавливая каждое значение. В VB .NET я не могу создать массив элементов управления, если кто-нибудь предоставит мне подобное решение.

Ответы [ 7 ]

13 голосов
/ 14 марта 2011

Вот пример, который я написал для чего-то другого, который показывает, как сделать что-то подобное, и показывает, как сделать обработчик. Это создает сетку кнопок 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
9 голосов
/ 14 марта 2011

Избегайте использования предложенных итерационных подходов, вы получите довольно случайную коллекцию элементов управления, если ваша форма не очень проста.Просто объявите управляющий массив в своем коде и инициализируйте его в конструкторе формы.Например:

Public Class Form1
    Private OrderNumbers() As TextBox

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

Теперь вы можете обращаться с номерами заказов так же, как в VB6.

3 голосов
/ 19 ноября 2013

Может быть, это проще.Чтобы создать контрольный массив, я поместил объявление контрольного массива в модуль.Например, если у меня есть Форма с тремя TextBox и я хочу, чтобы TextBox был частью массива элемента управления с именем «mytext», я объявляю свой массив элементов управления в модуле следующим образом:

Module Module1

Public mytext() As TextBox = {Form1.TextBox1, Form1.TextBox2, Form1.TextBox3}

End Module

И,Я использую TextBoxes из массива управления следующим образом:

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

Прелесть использования модуляявляется то, что TextBoxes даже не должны быть в той же форме.

1 голос
/ 14 марта 2011

Ваша форма, PanelControl или все, что может содержать дочерние элементы управления, будет иметь свойство с именем Controls.

. Вы можете перебрать все текстовые поля в элементе управления, используя

'Создайте список TextBox, например, Array, но лучше Dim myTextBoxControls As New List

For Each uxControl As UserControl in MyFormName.Controls
    If TypeOf(uControl) is TextBox
        myTextBoxControls.Add(uControl)
    End IF
Next

Теперь у вас есть итеративная коллекция, с которой вы можете работать.

Вы можете получить доступзначение TextBoxes со свойством EditValue.

Посмотрев на то, что вы пытаетесь сделать немного дальше.

Возможно, вы захотите присвоить всем вашим элементам управления имя с префиксом, давайтескажи 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 голос
/ 14 марта 2011

С помощью Winforms вы можете сделать следующее:

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

В вашей форме вы бы назвали свои текстовые поля somePrefix1, somePrefix2 и т. Д.

Вот это old article но он может дать вам больше информации.Топ метод очень прост.

0 голосов
/ 15 марта 2011

Так что это одна из функций, которая не сделала переход на VB.NET - точно :-( Однако вы можете выполнить большую часть того, что вы сделали бы в VB6, с помощью двух разных механизмов в .NET:сбор элементов управления и обработка событий элементов управления.

Цикл по коллекции элементов управления
В 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.Для этого вы будете использовать ключевое слово 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 keyслово в конце обработчика события.Вы выделяете различные элементы управления, которые вы хотите обработать, и событие, используя запятую.Убедитесь, что вы обрабатываете элементы управления с одинаковым объявлением события.Если вы когда-нибудь задавались вопросом, для чего был sender на каждом событии, вот одно из его применений.Приведите аргумент отправителя к типу элемента управления, с которым вы работаете, и присвойте его локальной переменной.После этого вы сможете получить доступ к элементу управления, вызвавшему событие, и управлять им так же, как если бы вы указали это в VB6, и индексировать его в массив.

Используя эти два метода, вы можете копировать функциональность массивов управления вVB6.Удачи.

0 голосов
/ 14 марта 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...