• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

fLaSh_PT

Enumerador de controls [transferido para wiki]

3 mensagens neste tópico

Boas ppl;

Vou postar umas funções que acho que pode ser muito útil para qualquer um.

Como devem saber o VB6 permitia arrays de controles, o que era muito útil para percorrer os controles todos em um determinado form..

O VB.NET não suporta esse tipo de métodos (ou não é aconselhável por causa das dependencias obsoletas que adiciona), no entanto estas funções que criei permite enumerar todos os controles de um determinado form muito simples!

VB.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

Simples exemplos como utilizar

        ' 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

C#

/// <summary>
/// Enumerador de controls
/// Codificado por fLaSh
/// carlosferreiracarlos@hotmail.com
/// 17-07-2009
/// </summary>
/// <remarks></remarks>
static class 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 static List<Control> EnumCtrlForm(Form oForm)
    {
        Control oCtrl = default(Control);
        List<Control> oCtrlList = new List<Control>();
        // Percorre todos os controls do Form
        foreach (var oCtrl in oForm.Controls) {
            //Egnora caso o control esteje a 'Nothing'
            if (oCtrl != null) {
                //Adiciona o Control a lista
                if (!string.IsNullOrEmpty(oCtrl.Name)) {
                    oCtrlList.Add(oCtrl);
                }
                // Verifica se o control é do tipo 'Container'
                if (oCtrl.Controls.Count > 0) {
                    // Como é tipo 'Container', é necessário enumerar os controles contidos..
                    EnumCtrl(oCtrl, oCtrlList);
                }
            }
        }
        return oCtrlList;
    }
    
    /// <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 static void EnumCtrl(Control oContainer, ref List<Control> oCtrlList)
    {
        Control oCtrl = default(Control);
        foreach (var oCtrl in oContainer.Controls) {
            //Egnora caso o control esteje a 'Nothing'
            if (oCtrl != null) {
                //Adiciona o Control a lista
                if (!string.IsNullOrEmpty(oCtrl.Name)) {
                    oCtrlList.Add(oCtrl);
                }
                // Verifica se o control é do tipo 'Container'
                if (oCtrl.Controls.Count > 0) {
                    // Se o control for do tipo 'SplitContainer', é necessário enumerar os dois paineis contidos..
                    if (oCtrl is SplitContainer) {
                        EnumCtrl(((SplitContainer)oCtrl).Panel1, oCtrlList);
                        EnumCtrl(((SplitContainer)oCtrl).Panel2, oCtrlList);
                    }
                    else {
                        EnumCtrl(oCtrl, oCtrlList);
                    }
                }
            }
        }
    }
  
}

Simples exemplos como utilizar

// Exemplo 1
// Enumera todos os controls e mostra o name dos mesmo na jenala 'Immediate Windows' do VS.

{
    foreach (Control oCtrl in EnumCtrlForm(this)) {
        Debug.WriteLine(Information.TypeName(oCtrl) + " : " + oCtrl.Name);
    }
    
    // Exmeplo 2
    // Enumera todos  os controls do tipo TextBox e mostra o name dos mesmo na jenala 'Immediate Windows' do VS.
    foreach (Control oCtrl in EnumCtrlForm(this)) {
        switch (true) {
            case oCtrl is TextBox:
                Debug.WriteLine(Information.TypeName(oCtrl) + " : " + oCtrl.Name);
                break;
            case oCtrl is Button:
                break;
            // Codigo aqui..
            case oCtrl is GroupBox:
                break;
        // Codigo aqui..
        // Etc...
        }
    }
}

Com este código fiz uma 'Engine' com XML, que salva todos os valores dos objectos de um determinado form, ou seja, quase não tenho trabalho em guardar os valores dos objectos.. a aplicação ao iniciar carrega os dados, e ao terminar guarda os.. talvez em traduza e post aqui..

Compr.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom Post. :(

Uma ideia era ter uma função para saber qual o tipo de determinado Controlo. Do género:

getType(nome_do_controlo)

E acho que isto ficava melhor no quadro Snippets/Armazém de Código com a tag [VB.Net]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora