Vb.net 如何在引用控件名称时使用变量

Vb.net 如何在引用控件名称时使用变量,vb.net,Vb.net,我目前正在学习如何使用Visual Basic作为as Level课程的一部分。对于我正在进行的一个项目,我想创建一个循环,通过这个循环,文本框的内容被输入到与这个问题无关的其他内容中。文本框被标记为txtName1,txtName2,等等,所以我认为最简单的方法是 Do Until r = 10 placeholder = txtName(r).Text r = r + 1 Loop 但这似乎不起作用。有没有办法在对象引用中使用变量?提前谢谢。您可以使用FindControl

我目前正在学习如何使用Visual Basic作为as Level课程的一部分。对于我正在进行的一个项目,我想创建一个循环,通过这个循环,文本框的内容被输入到与这个问题无关的其他内容中。文本框被标记为
txtName1
txtName2
,等等,所以我认为最简单的方法是

Do Until r = 10
    placeholder = txtName(r).Text
    r = r + 1
Loop

但这似乎不起作用。有没有办法在对象引用中使用变量?提前谢谢。

您可以使用
FindControl

试一试


在Windows窗体项目中,可以使用控件集合上的-方法按名称查找控件。这也适用于位于树中较深位置的控件(例如,如果控件位于面板上):


您还可以首先将需要触摸的控件存储在容器中(列表类型或字典类型),然后从变量中获取所需的控件,避免在每次搜索时重复UI控件

PS:您可以使用
字典(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
另一种不需要重新查询容器的解决方案:

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
Private子测试()
对于Me.Controls中的每个TB As文本框。
(文本框的)类型。
相反。
TakeWhile(函数(x)x.Name。
拆分(“txtName.ToCharArray”)。

最后假设使用Winforms而不是Webforms、WPF或MVC,我对此问题的首选解决方案是将每个文本框放置在一个公共父控件中。这可能是一个groupbox、一个面板,甚至是表单本身。然后您就有了这样的代码:

For Each box As TextBox In myParent.Controls.OfType(Of TextBox)()
    placeholder = box.Text
Next box

如果您需要引用这样的控件,那么您可能需要考虑更改您的设计


例如,您可以创建一个用户控件
MyTextBoxContainer
,其中动态创建这些
TextBox
(它们都有类似的用途,对吗?),然后提供一个访问器属性
TextAtIndex
,该属性获取一个索引,并将指定的
TextBox
Text
属性作为
字符串
返回。当添加到用户控件的控件集合中时,还应将对这些控件的引用保留在
通用.List
中供内部使用(这样索引就可以工作了)。

在我的例子中,投影的第一个元素是第十个文本框(txtname10),然后我需要反转这些元素,以第一个文本框(txtname1)开始。这很公平。我没有问题,我只是想问清楚。谢谢,我现在不能尝试,但我明天会。
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
For Each box As TextBox In myParent.Controls.OfType(Of TextBox)()
    placeholder = box.Text
Next box