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

13/04/2015

0

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.
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.
Elessandro Poças

Elessandro Poças

Responder

Posts

13/04/2015

Joel Rodrigues

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:
public void LimparControles(Control controle)
{
   if(controle is TextBox)
      (controle as TextBox).Clear();
   else if (controle is [um container])
      LimparControles(controle);
}


Abraço.
Responder

14/04/2015

Elessandro Poças

Obrigado Joel pelo feedback,

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

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);
Responder

14/04/2015

Joel Rodrigues

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

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


Concorda?

Abraço.
Responder

14/04/2015

Elessandro Poças

Joel muito obrigado pela sua ajuda,

Segue código com sua última dica:

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);
                }
            }
        }
Responder

14/04/2015

Joel Rodrigues

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar