VB.NET迭代表单标签

时间:2012-03-26 21:15:42

标签: vb.net forms loops iterator

我的设计表单上有几个标签框,它们共享命名约定lbl_#.text,其中#的范围从1到60.我想创建一个循环,遍历每个lbl_#.text添加一些增量值,让我们说这个问题的理论目的是2的倍数。

最终结果将达到以下目的:

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

我不确定如何通过编码方式访问每个标签,我只知道如何明确提及每个标签并指定一个值:/

3 个答案:

答案 0 :(得分:5)

这里有一些选择。

  • 在这种情况下,标签通常会有一个公共容器,例如面板或组框控件。在那种情况下:

    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循环完全相同。无论你做什么,都可以编写单个表达式来识别标签控件,然后在表达式结果上运行一个简单的循环。

这指向了最终策略:考虑绑定到数据源。使用数据源,您的标签会作为DataGridViewFlowLayoutPanel或类似控件的一部分创建。然后,您可以迭代网格或面板中的行。

答案 1 :(得分:2)

使用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

答案 2 :(得分:1)

如果您不知道有多少个标签,一个选项就是使用Do循环。

    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