Form.Controls returns Nothing if looking for a Con

2019-01-28 22:45发布

问题:

I converted a project from vb6 to vb.net where I found a given control that was inside a TabControl via the collection Controls as such

Frm.Controls("ControlName")

I checked and the control does exist in the form.

I iterated on all that is inside the Controls Collection and the control is not there, only the TabControl which contains it. Does it mean that in vb.net I have to design a function to do something that vb6 could do?

回答1:

You can use Me.Controls.Find("name", True) to search the form and all its child controlsto find controls with given name. The result is an array containing found controls.

For example:

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


回答2:

Here's an example of how to recursively loop through all controls by parent:

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