代码之家  ›  专栏  ›  技术社区  ›  Lauren

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

  •  0
  • Lauren  · 技术社区  · 7 年前

    当窗体加载时,我的程序会创建随机数目的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 回复  |  直到 7 年前
        1
  •  2
  •   djv    7 年前

    使用此选项按其名称获取控件

    <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
    

    在你的情况下,可以这样使用

    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)
    
        2
  •  1
  •   David Wilson    7 年前

    我猜你是在宣布 userAct 在子/功能程序中。虽然控件在运行时添加到表单中,但变量 用户行为 子/功能完成后超出范围。有几种可能的解决方案,但建议如下

    您可以使用您拥有的代码,但也可以将“userAct”字符串分配给。命名属性并使用以下内容访问控件:

    directcast(Me.Controls.Find("userAct", False)(0),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