如果在TabControl或Panel中查找Control,Form.Controls将返回Nothing

时间:2016-07-28 21:41:13

标签: .net vb.net winforms vb6

我将一个项目从vb6转换为vb.net,在那里我通过集合控件在TabControl中找到了一个给定的控件

Frm.Controls("ControlName")

我检查过,控件确实存在于表单中。

我迭代了Controls Collection中的所有内容,而控件不在那里,只有包含它的TabControl。这是否意味着在vb.net中我必须设计一个函数来执行vb6可以做的事情?

2 个答案:

答案 0 :(得分:3)

您可以使用Me.Controls.Find("name", True)搜索表单,并使用其所有子控件查找具有给定名称的控件。结果是一个包含找到的控件的数组。

例如:

Dim control = Me.Controls.Find("textbox1", True).FirstOrDefault()
If (control IsNot Nothing) Then
    MessageBox.Show(control.Name)
End If

答案 1 :(得分:1)

以下是如何通过父级递归遍历所有控件的示例:

Private Function GetAllControlsRecursive(ByVal list As List(Of Control), ByVal parent As Control) As List(Of Control)
    If parent Is Nothing Then Return list
    list.Add(parent)
    For Each child As Control In parent.Controls
        GetAllControlsRecursive(list, child)
    Next
    Return list
End Function

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Dim allControls As New List(Of Control)

    For Each ctrl In GetAllControlsRecursive(allControls, Me) '<= Me is the Form or you can use your TabControl

        'do something here...

        If Not IsNothing(ctrl.Parent) Then
            Debug.Print(ctrl.Parent.Name & " - " & ctrl.Name)
        Else
            Debug.Print(ctrl.Name)
        End If
    Next
End Sub