如何引用在运行时添加的文本框

时间:2017-11-01 13:56:00

标签: vb.net textbox

我的程序在表单加载时创建一个随机数量的TextBox控件。然后,我需要在代码中的其他位置引用已键入这些文本框的内容。我的问题是当我尝试这样做时出现错误。以下是我的代码。

Dim userAct As New TextBox
userAct.Location = New Point(386, 379)
userAct.Size = New Size(95, 34)
userAct.Font = New Font("Luicida Fax", 12.0!)
userAct.BackColor = SystemColors.InactiveCaption
userAct.BorderStyle = BorderStyle.None
userAct.Multiline = True
Me.Controls.Add(userAct)

userAct已创建,但我无法在代码中的任何位置引用此文本框。无论如何要克服这个?感谢

2 个答案:

答案 0 :(得分:2)

使用此命令获取名称

的控件
<Extension()> _
Public Function ControlByName(Of T As Control)(ByVal parent As Control, ByVal name As String) As T
    For Each c As T In parent.ChildControls(Of T)()
        If c.Name = name Then
            Return c
        End If
    Next
    Return Nothing
End Function

使用此方法获取表单上的所有控件,即使在容器

中也是如此
<Extension()> _
Public Function ChildControls(Of T As Control)(ByVal parent As Control) As List(Of T)
    Dim result As New List(Of T)
    For Each ctrl As Control In parent.Controls
        If TypeOf ctrl Is T Then result.Add(CType(ctrl, T))
        result.AddRange(ctrl.ChildControls(Of T)())
    Next
    Return result
End Function

(Control.Controls仅返回Control中包含的控件)

在你的情况下,这将被用作

Dim userAct As New TextBox
userAct.Location = New Point(386, 379)
userAct.Size = New Size(95, 34)
userAct.Font = New Font("Luicida Fax", 12.0!)
userAct.BackColor = SystemColors.InactiveCaption
userAct.BorderStyle = BorderStyle.None
userAct.Multiline = True
userAct.Name = "userActName" ' new
Me.Controls.Add(userAct)

Dim myUserAct As TextBox = Me.ControlByName(Of TextBox)("userActName")

或者,您可以使用此非通用版本

<Extension()> _
Public Function ControlByName(ByVal parent As Control, ByVal name As String) As Control
    For Each c As Control In parent.ChildControls
        If c.Name = name Then
            Return c
        End If
    Next
    Return Nothing
End Function

<Extension()> _
Public Function ChildControls(ByVal parent As Control) As List(Of Control)
    Return ChildControls(Of Control)(parent)
End Function

但你需要施展

Dim myUserAct As TextBox = DirectCast(Me.ControlByName("userActName"), TextBox)

答案 1 :(得分:1)

我猜你在子/函数程序中声明userAct。尽管控件在运行时添加到表单中,但在子/函数完成后变量userAct超出范围。有几种可能的解决方案,但建议如下

您可以使用您拥有的代码,还可以为.Name属性分配“userAct”字符串,并使用类似

的内容访问控件
directcast(Me.Controls.Find("userAct", False)(0),TextBox) 

然后可以使用与普通TextBox完全相同的方式。

directcast(Me.Controls.Find("userAct", False)(0),TextBox).Text="Hi there"

Dim S as string = directcast(Me.Controls.Find("userAct", False)(0),TextBox)(0).Text