Ir para o conteúdo

Enumerador de controlos

Para quem está familiarizado com as arrays de objectos do VB6, e os usava para percorrer os controlos do form, o seguinte bloco de código disponibiliza um enumerador de controlos que executa igualmente bem o trabalho, mas para .Net.

'' <summary>
''' Enumerador de controls
''' Codificado por fLaSh
''' carlosferreiracarlos@hotmail.com
''' 17-07-2009
''' </summary>
''' <remarks></remarks>
Module ControlEnum

    ''' <summary>
    ''' Enumera todos os controls do Form em uma 'List(Of Control)'
    ''' PS: está função irá apenas localizar os que estão na primeira 'camada'
    '''     ou seja, os controls do tipo 'Container', como groupbox, painel, etc..
    '''     Os restande serão enumerados por a função 'EnumCtrl'..
    ''' </summary>
    ''' <param name="oForm">O Form object a enumerar</param>
    ''' <returns>Lista de controls</returns>
    Public Function EnumCtrlForm(ByVal oForm As Form) As List(Of Control)
        Dim oCtrl As Control
        Dim oCtrlList As New List(Of Control)
        ' Percorre todos os controls do Form
        For Each oCtrl In oForm.Controls
            'Egnora caso o control esteje a 'Nothing'
            If oCtrl IsNot Nothing Then
                'Adiciona o Control a lista
                If Not String.IsNullOrEmpty(oCtrl.Name) Then
                    oCtrlList.Add(oCtrl)
                End If
                ' Verifica se o control é do tipo 'Container'
                If oCtrl.Controls.Count > 0 Then
                    ' Como é tipo 'Container', é necessário enumerar os controles contidos..
                    EnumCtrl(oCtrl, oCtrlList)
                End If
            End If
        Next
        Return oCtrlList
    End Function

    ''' <summary>
    ''' Enumera todos os controles em um determinado control do tipo 'Container'
    ''' </summary>
    ''' <param name="oContainer">Objectos com os controles</param>
    ''' <param name="oCtrlList">A list para adicionar os controls. PS: o parametro está por 'ByRef'</param>
    Public Sub EnumCtrl(ByVal oContainer As Control, ByRef oCtrlList As List(Of Control))
        Dim oCtrl As Control
        For Each oCtrl In oContainer.Controls
            'Egnora caso o control esteje a 'Nothing'
            If oCtrl IsNot Nothing Then
                'Adiciona o Control a lista
                If Not String.IsNullOrEmpty(oCtrl.Name) Then
                    oCtrlList.Add(oCtrl)
                End If
                ' Verifica se o control é do tipo 'Container'
                If oCtrl.Controls.Count > 0 Then
                    ' Se o control for do tipo 'SplitContainer', é necessário enumerar os dois paineis contidos..
                    If TypeOf oCtrl Is SplitContainer Then
                        EnumCtrl(CType(oCtrl, SplitContainer).Panel1, oCtrlList)
                        EnumCtrl(CType(oCtrl, SplitContainer).Panel2, oCtrlList)
                    Else
                        EnumCtrl(oCtrl, oCtrlList)
                    End If
                End If
            End If
        Next
    End Sub

End Module

Exemplos de utilização

        ' Exemplo 1
        ' Enumera todos os controls e mostra o name dos mesmo na jenala 'Immediate Windows' do VS.
        For Each oCtrl As Control In EnumCtrlForm(Me)
            Debug.WriteLine(TypeName(oCtrl) & " : " & oCtrl.Name)
        Next

        ' Exmeplo 2
        ' Enumera todos  os controls do tipo TextBox e mostra o name dos mesmo na jenala 'Immediate Windows' do VS.
        For Each oCtrl As Control In EnumCtrlForm(Me)
            Select Case True
                Case TypeOf oCtrl Is TextBox
                    Debug.WriteLine(TypeName(oCtrl) & " : " & oCtrl.Name)
                Case TypeOf oCtrl Is Button
                    ' Codigo aqui..
                Case TypeOf oCtrl Is GroupBox
                    ' Codigo aqui..
                    ' Etc...
            End Select
        Next