Array
(
)

Solução Limpa TextBox em CSHARP que desenvolvi depois de quebar muito a cabeça

Elessandro Poças
   - 13 abr 2015

Olá a todos,
Sou iniciante em programação, e estes dias me deparei com a seguinte situação para limpar todos os campos TextBox do meu formulário:
Imagine que você tenha a seguinte hierarquia dentro do seu formulário:
Formulário
|
--> TabControl
|
--> TabPage
| |
| --> TextBox
| |
| --> GroupBox
| |
| --> TextBox
|
--> FlowLayoutPanel
|
--> TextBox
Como fazer para limpar todos os TextBox? Para mim que seu iniciante fiquei 2 dias para resolver, então decidi postar um método que resolve este problema tão simples mas que para alguns pode ser um pouco complicado pela falta de experiência.
#Código

private void LimparTela()
        {
            foreach (Control ctrPai in this.Controls)
            {
                if (ctrPai is TabControl)
                {
                    foreach (Control ctr1 in ctrPai.Controls)
                    {
                        if (ctr1 is TabPage)
                        {
                            foreach (Control ctr2 in ctr1.Controls)
                            {
                                if (ctr2 is TextBox)
                                {
                                    (ctr2 as TextBox).Text = string.Empty;
                                }

                                if (ctr2 is GroupBox)
                                {
                                    foreach (Control item in ctr2.Controls)
                                    {
                                        if (item is TextBox)
                                        {
                                            (item as TextBox).Text = string.Empty;
                                        }
                                    }
                                }

                                if (ctr2 is FlowLayoutPanel)
                                {
                                    foreach (Control ctr3 in ctr2.Controls)
                                    {
                                        if (ctr3 is TextBox)
                                        {
                                            (ctr3 as TextBox).Text = string.Empty;
                                        }
                                    }                                    
                                }
                            }                            
                        }                        
                    }
                }
            }            
        } 

Comentários e críticas serão bem vindas.
Espero que este código possa ajudar a quem precise.

Joel Rodrigues
   - 13 abr 2015

Opa, parabéns pela iniciativa. Vou só formatar seu código pra facilitar a leitura, ok?

Agora vai a pergunta/desafio: sua solução funciona se houver vários containers aninhados na tela? TabControl dentro de TabPage, dentro de outra TabContrl, que está dentro de outra TabPage, etc.?

Você pode alterar essa abordagem para utilizar recursividade, e com isso deixar essa técnica funcional para qualquer estrutura de controles.

Seria algo mais ou menos assim:
#Código

public void LimparControles(Control controle)
{
   if(controle is TextBox)
      (controle as TextBox).Clear();
   else if (controle is [um container])
      LimparControles(controle);
}


Abraço.

Elessandro Poças
   - 14 abr 2015

Obrigado Joel pelo feedback,

Seria +- assim código, no meu formulário funcionou.

#Código

private void Limpar(Control controlePai)
        {
            foreach (Control ctr in controlePai.Controls)
            {
                if (ctr is TextBox)
                {
                    (ctr as TextBox).Text = string.Empty;
                }
                else if (ctr.Controls.Count > 0)
                {
                    Limpar(ctr);                    
                }

                if (ctr is MaskedTextBox)
                {
                    (ctr as MaskedTextBox).Text = string.Empty;
                }
                else if (ctr.Controls.Count > 0)
                {
                    Limpar(ctr);
                }
            }
        }


Para chamar o método:
Limpar(this);

Joel Rodrigues
   - 14 abr 2015

Show de bola, parabéns.
Mas ainda dá pra melhorar. Observe que o else-if está repetido.
O ideal seria:

#Código

if(textbox)
else if(maskedtextbox)
else if(controls > 0)


Concorda?

Abraço.

Elessandro Poças
   - 14 abr 2015

Joel muito obrigado pela sua ajuda,

Segue código com sua última dica:

#Código

private void LimparCampos2(Control controlePai)
        {
            foreach (Control ctr in controlePai.Controls)
            {
                if (ctr is TextBox)
                {
                    (ctr as TextBox).Text = string.Empty;                    
                }
                else if (ctr is MaskedTextBox)
                {
                    (ctr as MaskedTextBox).Text = string.Empty;
                }
                else if (ctr.Controls.Count > 0)
                {
                    LimparCampos2(ctr);
                }
            }
        }

Joel Rodrigues
   - 14 abr 2015

Valeu, Elssandro.
Novamente parabéns pela iniciativa de compartilhar sua solução.
Um abraço e bons códigos.