VB.NET Итерация меток форм - PullRequest
3 голосов
/ 27 марта 2012

У меня есть несколько полей меток в моей форме проектирования, которые все разделяют соглашение об именах lbl_#.text, где # колеблется от 1 до 60. Я хочу сделать цикл, который проходит через каждый lbl_#.text, добавляя некоторое инкрементное значение, скажем, кратноиз 2 для теоретической цели этого вопроса.

Что-то такое, что конечный результат будет следующим:

lbl_1.text = "2"
lbl_2.text = "4"
lbl_3.text = "6"
...
lbl_60.text = "120"

Я не уверен, как получить доступ к каждой из этих меток через кодированиесторона, я только знаю, как явно упомянуть каждую метку и присвоить значение: /

Ответы [ 3 ]

5 голосов
/ 27 марта 2012

Здесь есть несколько вариантов.

  • В этой ситуации надписи часто имеют общий контейнер, такой как панель или элемент управления групповой коробкой.В этом случае:

    Dim formLabels =  myContainerControl.Controls.OfType(Of Label)()
    For Each formLabel As Label In formLabels
       '...
    Next formLabel
    

    Конечно, это смешивает логические группы с визуальными группировками.Эти две вещи не всегда хорошо выровнены, поэтому вы также можете ...

  • Добавить их все в массив Label (или List(Of Label) или любой другой перечисляемый):

    Dim formLabels(60) As Label = {lbl_1, lbl_2, lbl_3 .... }
    
    For Each formLabel As Label in formLabels
        '...
    Next formLabel
    

    Но иногда это больше проблем, чем стоит, даже если вы используете цикл для создания коллекции, и поэтому вы также можете

  • Использовать .Nameсвойство (в сочетании с соглашением об именах для определения желаемых элементов управления):

    Dim formLabels = Controls.Where(Function(c) c.Name.StartsWith("lbl_"))
    For Each formLabel As Label In formLabels
        '...
    Next formLabel
    
  • Некоторая комбинация вышеперечисленного (например, код в событии загрузки формы для создания списка на основев свойстве name).

Обратите внимание, что фактический цикл For Each равен точно такой же во всех этих параметрах.Независимо от того, что вы делаете, вы можете написать одно выражение для определения элемента управления меткой, а затем выполнить простой цикл над результатом выражения.

Это указывает на окончательную стратегию: мыслите в терминахпривязки к источнику данных.С источником данных ваши метки создаются как часть DataGridView, FlowLayoutPanel или аналогичного элемента управления.Затем вы можете перебирать строки в сетке или на панели.

2 голосов
/ 27 марта 2012

Используйте коллекцию Controls:

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles    MyBase.Load
        Dim i As Integer
       For i = 1 To 3
            Dim myLabel As Label = CType(Me.Controls("lbl_" & i), Label)
            myLabel.Text = ...whatever value you want to put here
        Next
    End Sub
End Class
1 голос
/ 27 марта 2012

Если вы не знаете, сколько существует меток, одним из вариантов является использование Do Loop.

    Dim lblTarget As Label = Nothing
    Dim intCursor As Integer = 1
    Dim bolFirstIteration As Boolean = True

    Do Until lblTarget Is Nothing AndAlso Not bolFirstIteration

        If bolFirstIteration Then

            bolFirstIteration = False

        End If

        lblTarget = CType(Me.Controls("lbl_" & intCursor.ToString()), Label)

        If Not lblTarget Is Nothing Then

            lblTarget.Text = (intCursor * 2).ToString()

        End If

        intCursor += 1

    Loop
...