VB.NET-动态创建的控件以及如何操作它们

时间:2018-08-09 20:44:01

标签: vb.net

如果我这样创建控件:

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'。

所以,我的问题是:如何引用以这种方式创建的控件? (我能想到的唯一方法是循环遍历所有控件,直到找到所需的控件为止,但这对我来说似乎效率不高。)

1 个答案:

答案 0 :(得分:4)

  

直到运行时才定义“ newLabel””

那不是很准确。您正在将对象与用于引用该对象的变量混淆。在设计器中向窗体添加控件时,VS会生成代码以创建和配置该控件。它与您编写和发布的代码几乎相同。您可以在设计器代码文件中看到它,如果您在解决方案资源管理器中单击“加载所有文件”按钮,则可以访问该文件。该代码包括一个成员变量,创建的对象将分配给该成员变量。然后,您可以使用该成员变量在代码中引用该对象。

如果要在运行时创建控件,则通常无法声明要分配给每个变量的成员变量,因为您不知道会有多少个成员变量。如果您知道会有多少,那么您可能应该在设计时添加它们。这意味着您有两个选择:

  1. 声明一个成员变量,该成员变量将引用在运行时创建的控件的集合,然后通过名称或索引从中进行访问。

  2. 从表单的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)