如果我这样创建控件:
Dim fb As New Label
With fb
.Name = "newLabel"
.text = "some text"
<etc.>
Me.Controls.Add(fb)
End With
现在,如果我想在运行时更改该标签上的文本,通常可以这样做:
newLabel.text = "some other text"
不幸的是,Visual Studio不允许我这样做,因为直到运行时才定义'newLabel'。
所以,我的问题是:如何引用以这种方式创建的控件? (我能想到的唯一方法是循环遍历所有控件,直到找到所需的控件为止,但这对我来说似乎效率不高。)
答案 0 :(得分:4)
直到运行时才定义“ newLabel””
那不是很准确。您正在将对象与用于引用该对象的变量混淆。在设计器中向窗体添加控件时,VS会生成代码以创建和配置该控件。它与您编写和发布的代码几乎相同。您可以在设计器代码文件中看到它,如果您在解决方案资源管理器中单击“加载所有文件”按钮,则可以访问该文件。该代码包括一个成员变量,创建的对象将分配给该成员变量。然后,您可以使用该成员变量在代码中引用该对象。
如果要在运行时创建控件,则通常无法声明要分配给每个变量的成员变量,因为您不知道会有多少个成员变量。如果您知道会有多少,那么您可能应该在设计时添加它们。这意味着您有两个选择:
声明一个成员变量,该成员变量将引用在运行时创建的控件的集合,然后通过名称或索引从中进行访问。
从表单的Controls
集合或必须添加它们的其他容器控件的名称中按名称访问它们,以便显示它们。
选项2要求您在创建每个控件时为其提供唯一的名称。选项1完全不需要名称,尽管它并不排除名称。
选项1可能看起来像这样:
在课堂上:
Private labels As New List(Of Label)
在某处的方法中:
For i = 0 To 9
Dim lbl As New Label
labels.Add(lbl)
Controls.Add(lbl)
Next
稍后:
Dim lbl = labels(recordIndex)
选项2可能看起来像这样:
在某处的方法中:
For i = 0 To 9
Dim lbl As New Label With {.Name = "titleLabel" & i}
Controls.Add(lbl)
Next
稍后:
Dim lbl = DirectCast(Controls("titleLabel" & recordIndex), Label)