我有一个动态创建控件并自行添加事件处理程序的表单(已经对那部分进行了编码)。至于现在,我有一个带有对象列表的隐藏表,它遍历控件并按名称找到它(使用 Me.Controls 集合)。但是,有谁知道动态创建的控件是否有特殊的唯一代码?
我相信有一个,但我不知道......
任何帮助将不胜感激!
多伦。
所有控件都有一个Handle
应该是唯一的属性。如果您想对其进行更多控制(请原谅双关语),您可以将Tag
每个控件的属性设置为新的 GUID。然后你可以用它来唯一地识别它们。
Dim dynamicControl As Control = ...
dynamicControl.Tag = Guid.NewGuid().ToString()
但是,我不明白为什么您用于Name
属性的值还不是唯一的,因为这将是唯一标识控件的正常方法。
我假设您在创建时设置 Control.Name 属性?
你可能在 Control.Handle 之后?
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
' create controls
For i As Integer = 1 To 5
Dim t As New TextBox
t.Name = "TextBox" & i
Me.Controls.Add(t)
Next
' list controls
For Each c As Control In Me.Controls
Debug.Print(c.Name & " has handle " & c.Handle.ToString)
Next
' check fopr existence of controls
For i As Integer = 0 To 7
If Me.Controls.ContainsKey("TextBox" & i) Then
Debug.Print("TextBox" & i & " exists")
Else
Debug.Print("TextBox" & i & " doesn't exist")
End If
Next
End Sub
End Class
该程序创建以下输出:
TextBox1 has handle 2361834
TextBox2 has handle 3739570
TextBox3 has handle 8130020
TextBox4 has handle 5048814
TextBox5 has handle 6425036
TextBox0 doesn't exist
TextBox1 exists
TextBox2 exists
TextBox3 exists
TextBox4 exists
TextBox5 exists
TextBox6 doesn't exist
TextBox7 doesn't exist
如果您使用的是自定义控件,那么这很容易实现,如果您尝试使用内置控件(标签、按钮、文本框等)来实现,那就有点棘手了。
我为其他做类似但在这里使用自定义控件的人回答了这样的问题。
对于内置控件,您可以做几件事。您可以像 Steven Doggart 提到的那样在 Tag 属性中设置值,或者您可以创建自己的自定义类来继承您想要使用的控件并向其添加任何标识属性。
一旦您选择了一种存储 ID 的方法,您就可以在Me.Controls
集合上实际使用 LINQ 并按类型/标签/其他方式获取所有控件。话虽如此,我认为表单上的每个单独控件都没有一个易于访问/可预测的唯一标识符。如果你想具体引用一个特定的控件,那么你需要给它一个你可以在运行时假设的标识符,否则没有人,包括你,将确切地知道你应该使用哪个控件。