【问题标题】:How To Get Control Property by "String Name"?如何通过“字符串名称”获取控件属性?
【发布时间】:2013-02-11 04:29:40
【问题描述】:

我在下一个循环中通过编码创建了按钮和文本框, 结果

'T(x).Name = "text_1"
'T(x).Name = "text_2"
'T(x).Name = "text_3"
'....

'B(x).Name = "button_1"
'B(x).Name = "button_2"
'B(x).Name = "button_3"
'...

我想在单击按钮时获取文本框属性, 单击button_1.Name.ToString 时我可以获得按钮属性 但我无法获得 text_1,2,3 .... 属性。

我通过拆分函数 button_1.Name.ToString 做了一些技巧并得到最后一个数字 并将其添加到文本框名称中,例如"text_" & button_1.Name.ToString,但我无法将此字符串转换为对象。

更新

这是我用来在循环中加载控件的代码:

C_A_TEXT(x) = New TextBox() 
C_A_TEXT(x).Dock = System.Windows.Forms.DockStyle.Fill 
C_A_TEXT(x).Location = New System.Drawing.Point(270, 5) 
C_A_TEXT(x).Margin = New System.Windows.Forms.Padding(0) 
C_A_TEXT(x).Size = New System.Drawing.Size(70, 27) 
C_A_TEXT(x).TabIndex = 5 
C_A_TEXT(x).Name = "NEW_RECHARGE_COUNT_TEXT_" & x

更新 2

这里还有一些代码:

AddHandler C_A_BUTTONS(x).Click, AddressOf C_A_BUTTON 

Private Sub C_A_BUTTON(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    Dim thisButton As Button = sender Dim A = CType(Me.Controls("NEW_RECHARGE_COUNT_TEXT_1"), TextBox) 
    MsgBox(A.Text.ToString)  'Error!
End Sub

【问题讨论】:

    标签: vb.net string object controls


    【解决方案1】:

    以上都不适合我。这样做:

    Dim selVal As String = CType(Form.FindControl(myListName), DropDownList).SelectedValue
    

    【讨论】:

      【解决方案2】:
      Dim sometext As TextBox = CType(Me.Controls("sometext "), TextBox)
      

      【讨论】:

      • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
      【解决方案3】:

      下面是代码。

      Dim oObj As Object = Me.Controls.Find("control name", True).FirstOrDefault()
      Obj.Property = Value
      

      希望对你有帮助。

      【讨论】:

      • 这是唯一对我有用的解决方案。谢谢@thewaywewere。此外,可以使用 CType 将对象转换为所需的控件类型。 Dim oObj As Object = Me.Controls.Find("控件名称", True).FirstOrDefault() txtbox = CType(oobj,TextBox)
      【解决方案4】:

      作为一个快速有用的提示,您似乎不必为了访问表单上的控件而在 CType 语句中指定控件的类型。我在尝试使用相同的代码行访问多种类型的表单控件(例如按钮和文本框)时遇到了这种情况。

      CType(Controls("NAME_OF_CONTROL"), Control)
      

      请注意,您无需准确指定控件的类型,例如“TextBox”或“Button”,只需声明“Control”即可。这使您可以通用地更改任何类型的控件,而无需指定其类型。

      我在其他任何地方都找不到这个,所以我想我会分享它!

      【讨论】:

        【解决方案5】:

        主题的标题和您对手头问题的描述似乎有点不同。

        要回答您的标题(按名称查找控件),请使用以下命令:

        Dim myControlToFind = LayoutRoot.FindName("NAMEOFCONTROL")
        

        有关此方法的更多信息可以找到here

        要回答问题的描述(在单击后访问代码生成的控件),请执行以下操作:

        在创建控件的循环中添加以下处理程序

        Addhandler YOURCONTROL.Clicked, AddressOf Textbox_Clicked
        

        ...然后这将处理点击事件

        Private Sub Textbox_Clicked(sender as object, e as RoutedEventArgs)
        
        Dim tbClicked = Ctype(sender, TextBox)
        'You can now access any of the properties of the textbox, for example
        
        Dim txt as String = tbClicked.Text
        Dim name as String = tbClicked.Name
        Dim height as Double = tbClicked.Height
        
        End Sub
        

        【讨论】:

        • 您的答案假定 WPF。由于 Hesham 从未指定过,您可能在该假设中是正确的,但我对此表示怀疑。
        • 实际上,鉴于他刚刚添加到我的答案中的评论,我会说几乎可以肯定他正在使用 WinForms。
        • 感谢您抽出宝贵时间,但在这里Dim tbClicked = Ctype(sender, TextBox) 我想将sender 替换为"TEXT_BOX_1" 之类的字符串名称,因为我想单击按钮而不是文本框。
        【解决方案6】:

        您可以通过Form.Controls 属性按名称访问控件,例如:

        Dim text1 As TextBox = CType(Me.Controls("text_1"), TextBox)
        

        【讨论】:

        • 我想通过字符串名称(“NAME”)选择控件
        • 这正是我所展示的。在我的示例中,字符串名称为"text_1"
        • 我知道,但是当我尝试MsgBox(text1.Name.ToString) 结果Error :(,我无法获得任何财产。
        • 您需要展示如何在循环中创建/加载控件。
        • 控件是否真的显示在表单上?我没有看到您将它们添加到表单的哪个位置?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-08-02
        • 2012-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多