Solução Limpa TextBox em CSHARP que desenvolvi depois de quebar muito a cabeça
13/04/2015
0
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
Posts
13/04/2015
Joel Rodrigues
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.
14/04/2015
Elessandro Poças
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);
14/04/2015
Joel Rodrigues
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.
14/04/2015
Elessandro Poças
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); } } }
14/04/2015
Joel Rodrigues
Novamente parabéns pela iniciativa de compartilhar sua solução.
Um abraço e bons códigos.
Clique aqui para fazer login e interagir na Comunidade :)