我的设计表单上有几个标签框,它们共享命名约定lbl_#.text
,其中#的范围从1到60.我想创建一个循环,遍历每个lbl_#.text
添加一些增量值,让我们说这个问题的理论目的是2的倍数。
最终结果将达到以下目的:
lbl_1.text = "2"
lbl_2.text = "4"
lbl_3.text = "6"
...
lbl_60.text = "120"
我不确定如何通过编码方式访问每个标签,我只知道如何明确提及每个标签并指定一个值:/
答案 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
循环与完全相同。无论你做什么,都可以编写单个表达式来识别标签控件,然后在表达式结果上运行一个简单的循环。
这指向了最终策略:考虑绑定到数据源。使用数据源,您的标签会作为DataGridView
,FlowLayoutPanel
或类似控件的一部分创建。然后,您可以迭代网格或面板中的行。
答案 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