我目前正在学习如何使用Visual Basic作为AS-Level课程的一部分。对于我正在进行的项目,我想创建一个循环,将文本框的内容输入到其他内容中,与此问题无关。文本框标记为txtName1
,txtName2
,依此类推,因此我认为最简单的方法就是
Do Until r = 10
placeholder = txtName(r).Text
r = r + 1
Loop
但这似乎不起作用。有没有办法在对象引用中使用变量?提前谢谢。
答案 0 :(得分:3)
您可以使用FindControl
尝试
placeholder = ((TextBox)Me.FindControl(txtName & cstr(r))).Text
答案 1 :(得分:3)
假设Winforms而不是Webforms,WPF或MVC,我对此问题的首选解决方案是将每个文本框放在一个公共父控件中。这可以是一个组合框,一个面板,甚至是表单本身。然后你有这样的代码:
For Each box As TextBox In myParent.Controls.OfType(Of TextBox)()
placeholder = box.Text
Next box
答案 2 :(得分:2)
在Windows窗体项目中,您可以使用Controls-collection上的Find - 方法按名称查找控件。这也适用于位于树中较深处的控件(例如,如果控件位于Panel上):
For i As Integer = 1 To 10
placeholder = Controls.Find("txtName" & i, True).First().Text
Next
答案 3 :(得分:1)
您还可以首先存储需要在容器中触摸的控件(List类型或Dictionary类型),然后从变量中获取所需的控件,避免这种方式在UI控件的所有时间进行迭代每次搜索。
PS:您可以使用dictionary(of integer, tetxbox)
使用键作为索引,以便更灵活地使用它们。
Public Class Form1
Private TextBoxes As List(Of TextBox)
Private placeholder As String
Private Shadows Sub Load() Handles MyBase.Load
TextBoxes = Me.Controls.OfType(Of TextBox)().Reverse.ToList
End Sub
Private Shadows Sub Shown() Handles MyBase.Shown
For Each TB As TextBox In TextBoxes.GetRange(0, 10) ' From txtName1 to txtName10
placeholder = TB.Text
Next
End Sub
End Class
没有容器requeriment的另一个解决方案:
Private Sub Test()
For Each TB As TextBox In Me.Controls.
OfType(Of TextBox).
Reverse.
TakeWhile(Function(x) x.Name.
Split("txtName".ToCharArray).
Last <= 10)
MsgBox(TB.Name) ' From txtName1 to txtName10
Next
End Sub
答案 4 :(得分:1)
如果您需要引用这样的控件,您可能需要考虑更改设计。
例如,您可以创建一个用户控件MyTextBoxContainer
,其中这些TextBox
动态创建(它们都有相似的目的,对吗?),然后提供一个访问属性{{ 1}},它接受一个索引,并将指定TextAtIndex
的{{1}}属性作为Text
返回。添加到用户控件的控件集合时,您还可以在TextBox
中保留对这些控件的引用以供内部使用(以便索引可以正常工作)。