如何唯一标识动态加载的控件

时间:2012-06-15 13:10:24

标签: vb.net winforms

我有一个动态创建控件的表单,并自己添加事件处理程序(已编码该部分)。至于现在,我有一个带有对象列表的隐藏表,它循环遍历控件并按名称查找(使用Me.Controls集合)。然而,有谁知道动态创建的控件是否可能具有特殊的唯一代码?

我相信有一个,但我不知道......

任何帮助都会受到极大关注!

多伦。

3 个答案:

答案 0 :(得分:1)

所有控件都有一个Handle属性,该属性应该是唯一的。如果你想要更多地控制它(原谅双关语),你可以将每个控件的Tag属性设置为新的GUID。然后你可以使用它来唯一地识别它们。

Dim dynamicControl As Control = ...
dynamicControl.Tag = Guid.NewGuid().ToString()

但是,我不明白为什么您用于Name属性的值不是唯一的,因为这是唯一标识控件的常用方法。

答案 1 :(得分:0)

如果您使用自定义控件,那么这很容易实现,如果您尝试使用内置控件(标签,按钮,文本框等),那么它有点棘手。

我为其他人做了类似但使用自定义控件here的问题回答了这样的问题。

对于内置控件,您可以做几件事。您可以在Steven Doggart提到的Tag属性中设置值,也可以创建自己的自定义类来继承您要使用的控件,并添加您想要的任何标识属性。

一旦选择了存储ID的方法,您就可以在Me.Controls集合上实际使用LINQ,并按类型/标签/其他方式取出所有控件。话虽如此,我认为表格上的每个控件都没有易于访问/可预测的唯一标识符。如果你想特别引用一个特定的控件,你需要给它一个你能在运行时假设的标识符,否则没有人,包括你,将确切地知道你应该使用哪个控件。

答案 2 :(得分:0)

我假设您在创建时设置了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