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

时间:2013-11-25 15:40:52

标签: vb.net

我目前正在学习如何使用Visual Basic作为AS-Level课程的一部分。对于我正在进行的项目,我想创建一个循环,将文本框的内容输入到其他内容中,与此问题无关。文本框标记为txtName1txtName2,依此类推,因此我认为最简单的方法就是

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

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

5 个答案:

答案 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中保留对这些控件的引用以供内部使用(以便索引可以正常工作)。