我的程序在表单加载时创建一个随机数量的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
已创建,但我无法在代码中的任何位置引用此文本框。无论如何要克服这个?感谢
答案 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