Как ссылаться на элементы управления, используя переменную в al oop? - PullRequest
0 голосов
/ 23 марта 2020

У меня есть ярлыки с именами: label1, label2, ... label16. Я хочу назначить случайное число для всех них.

Что-то вроде этого может работать, но я не знаю синтаксис:

for i = 1 to 16
        label(i).text = Math.Ceiling(Rnd() * 99)
next

Ваши предложения будут оценены.

Ответы [ 3 ]

1 голос
/ 23 марта 2020

Вы можете использовать это, используя Controls.Find:

For i As Integer = 1 To 16
    Dim arrCtrl() As Control = Me.Controls.Find("label" & i, True)

    If arrCtrl.Length = 1 AndAlso TypeOf arrCtrl(0) Is Label Then
        DirectCast(arrCtrl(0), Label).Text = Math.Ceiling(Rnd() * 99)
    End If
Next
0 голосов
/ 24 марта 2020
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim labels As New List(Of Label) From {Label1, Label2, Label3, Label4}
    For Each l As Label In labels
        l.Text = rand.Next(99).ToString
    Next
End Sub

Для использования вашего подхода

  1. Объявите переменную для класса Random вне вашего метода (переменная уровня формы).

  2. Создайте список меток.

  3. L oop через все метки в вашем списке и установите свойство .Text с помощью метода .Next класса Random.

0 голосов
/ 23 марта 2020

Получение случайного целого числа


Используйте класс Случайный вместо функции Rnd для получить случайный Integer в пределах указанного диапазона в методе Random.Next(Int32, Int32). Объявите переменную класса типа Random:

Private ReadOnly rand As New Random

Поиск диапазона элементов управления


Этот фрагмент кода повторяется Controls коллекция контейнера возвращает - если таковые имеются - Label контролирует, где их имена равны диапазону имен, начинается с label1 до label16, и, наконец, присваивает случайный Integer их Text properties:

Private Sub TheCaller()
    For Each lbl In Controls.OfType(Of Label).
        Where(Function(x) Enumerable.Range(1, 16).
        Any(Function(y) x.Name.ToLower.Equals($"label{y}")))
        lbl.Text = rand.Next(1, 100).ToString
    Next
End Sub

На всякий случай, если элементы управления Label размещены в разных контейнерах, вам нужна рекурсивная функция для их получения:

Private Function GetAllControls(Of T)(container As Control) As IEnumerable(Of T)
    Dim controls = container.Controls.Cast(Of Control)

    Return controls.SelectMany(Function(x) GetAllControls(Of T)(x)).
        Concat(controls.OfType(Of T))
End Function

И Назовите это следующим образом:

Private Sub TheCaller()
    For Each lbl In GetAllControls(Of Label)(Me).
        Where(Function(x) Enumerable.Range(1, 16).
        Any(Function(y) x.Name.ToLower.Equals($"label{y}")))
        lbl.Text = rand.Next(1, 100).ToString
    Next
End Sub
...