Imports System.Text

''' <summary>
''' Este ejemplo muestra el uso de controles contenedores.
''' Ya que cada contenedor sólo informa de los controles
''' de primer nivel que contiene, es necesario una función 
''' recursiva para recorrer la totalidad de controles del formulario.
''' </summary>
''' <remarks></remarks>
Public Class Form1

    Private informe As StringBuilder

    Public Sub New()

        InitializeComponent()

        informe = New StringBuilder()

    End Sub

    Private Sub MenuSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuSalir.Click
        Me.Close()
        Me.Dispose()
    End Sub

    Private Sub MenuVerInforme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MenuVerInforme.Click
        VisualizaInforme()
    End Sub

    Private Sub VisualizaInforme()

        informe = New StringBuilder

        InformeFormulario()

        ArmaInforme(Me.Controls)

        MessageBox.Show(informe.ToString(), "Detalle de controles del formulario", MessageBoxButtons.OK, MessageBoxIcon.Information)

    End Sub

    Private Sub InformeFormulario()
        informe.Append("Contenedor -> ")
        informe.Append(Me.Name)
        informe.Append(" - Contiene: ")
        informe.Append(Me.Controls.Count.ToString())
        informe.Append(" controles")
        informe.Append(vbCrLf)
    End Sub

    Private Sub ArmaInforme(ByVal controles As Control.ControlCollection)

        For Each control As Control In controles
            If control.HasChildren Then
                informe.Append("Contenedor -> ")
                informe.Append(control.Name)
                informe.Append(" - Contiene: ")
                informe.Append(control.Controls.Count.ToString())
                informe.Append(" controles")
                informe.Append(vbCrLf)
                ArmaInforme(control.Controls)
            Else
                informe.Append("Control Hijo -> ")
                informe.Append(control.Name)
                informe.Append(" - Es hijo de: ")
                informe.Append(control.Parent.Name)
                informe.Append(vbCrLf)
            End If
        Next
    End Sub

    Private Sub Salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Salir.Click
        Me.Close()
        Me.Dispose()
    End Sub

    Private Sub VerInforme_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VerInforme.Click
        VisualizaInforme()
    End Sub
End Class
