VB.NET迭代窗体标签

3
我设计的表单上有几个标签框,它们都共享命名约定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

这里有几个选择。

  • In this situation the labels will often have a common container, such as panel or groupbox control. In that case:

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

    Of course, this mixes logical groups with visual groupings. Those two things don't always align well, so you can also...

  • Add them all to a Label array (or List(Of Label) or any other enumerable):

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

    But sometimes that's more trouble than it's worth, even if you use a loop to create the collection, and so you can also

  • Use the .Name property (in conjunction with a naming convention to identify your desired controls):

    Dim formLabels = Controls.Where(Function(c) c.Name.StartsWith("lbl_"))
    For Each formLabel As Label In formLabels
        '...
    Next formLabel
    
  • Some combination of the above (for example, code in the form load event to create a list based on the name property).

请注意,所有选项中实际的For Each循环都是完全相同的。无论您做什么,都要达到一个点,能够编写单个表达式来识别标签控件,然后在表达式结果上运行简单的循环。
这指向了一种最终的策略:以数据源为基础进行绑定。使用数据源,您的标签将作为DataGridViewFlowLayoutPanel或类似控件的一部分创建。然后,您可以迭代网格或面板中的行。

这是一个很棒的答案!非常感谢你。 - Cary Bondoc

1
使用 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
这是一个糟糕的实现。您正在指定强命名标签的假定范围的高低边界。如果标签2被重命名或丢失,您的代码将会出错。它不会考虑随时间添加的标签。正确的方法是使用for each循环并迭代包含在[containerObjectName].Controls.OfType(of Label)()中的标签对象。 - user4914655
为什么这很“糟糕”?用户说:“我在我的设计表单上有几个标签框,它们都共享命名约定lbl_#.text,其中#的范围从1到60。”请告诉我哪里不符合要求。 - deadlyvices
无论如何,由于更好的答案已经出现,我很乐意删除这个回答。但并不是因为它没有完全做到要求。 - deadlyvices
这个确切的问题来说,还算可以。然而,一般来说,从谷歌搜索进来的人并不建议采用这种方法。 - User
1
这是一个公正的评论。我将来会记住这个普遍观点。谢谢。 - deadlyvices

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接