VERIFICAR TODAS AS TEXTBOX VAZIAS

JORGESALES 16/06/2016 00:26:23
#463586
Pessoal olha eu aqui de novo (longo tempo ausente).
Estou me aventurando no C# e para não cometer os mesmos erros que cometia
antes gostaria da ajuda de vocês para vericar se existe alguma textbox vazia.
Ao depurar o código abaixo percebo que o sistema não encontra nenhuma
textbox mesmo tendo 4, o que pode estar errado?
      private void cmdComentar_Click(object sender, EventArgs e)
{
if (!Validar(this))
{
MessageBox.Show([Ô]Campos obrigatórios não foram preechidos![Ô], [Ô]MyFistProject[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
}
private bool Validar(Control con)
{
int nulos = 0;
foreach (Control c in con.Controls)
{
if (c is TextBox)
{
if (c.Text == string.Empty)
nulos++;
}
}
return (nulos == 0);
}
}

PS: é bom estar de volta....
Ah, só uma observação, o código acima é uma adaptação feita por mim deste aqui:
        private void ClearAllText(Control con)
{
foreach (Control c in con.Controls)
{
imgMembro.Image = Properties.Resources.Usuario;
if (c is TextBox)
((TextBox)c).Clear();
else
ClearAllText(c);

if (c is ComboBox)
((ComboBox)c).Text = string.Empty;
else
ClearAllText(c);

if (c is MaskedTextBox)
((MaskedTextBox)c).Clear();
else
ClearAllText(c);
}
}
LUIZCOMINO 16/06/2016 00:54:26
#463588
Resposta escolhida
Amigo tente:

private bool Validar(Control con)
{
foreach (Control c in con.Controls)
{
if (c is TextBox)
{
if (c.Text == [Ô][Ô])
{return false;}
}
}
return true;
}
}
JABA 16/06/2016 01:40:14
#463589
Se você quiser colocar os campos em sequência, tu vai ter que jogar a variável [txt-color=#e80000]nulos[/txt-color] para fora do método;

[txt-color=#e80000]int nulos = 0;[/txt-color]

private void Validar(Control con)
{
if (con.Controls.Count > 0) {
foreach (Control c in con.Controls)
{
if (c.Controls.Count == 0) {
if (c is TextBox) {
c.Text = string.Empty;
nulos++;
}
}
else {
Validar(c);
}
}
}
}

KERPLUNK 16/06/2016 03:30:02
#463591
Dá pra matar com um só comando:

this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
NICKOSOFT 16/06/2016 06:12:00
#463593
para essas verificações gosto de usar o erroprovider, já faço verificação até do correto preenchimento ;)
JABA 16/06/2016 13:46:20
#463625
Citação:

this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());



Esse código só funciona dentro de um único contêiner. Se ele tiver controles jogados dentro dos contêineres para uma mesma tela, não vai limpar.
KERPLUNK 16/06/2016 18:23:03
#463651
Citação:

:
this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());

Esse código só funciona dentro de um único contêiner. Se ele tiver controles jogados dentro dos contêineres para uma mesma tela, não vai limpar.


Então, basta um método recursivo, aqui como um método de extensão:

public static IEnumerable<T> FindAllChildrenByType<T>(this Control control)
{
IEnumerable<Control> controls = control.Controls.Cast<Control>();
return controls.OfType<T>().Concat<T>(controls.SelectMany<Control, T>(ctrl => FindAllChildrenByType<T>(ctrl)));
}


E onde quiser o método funcionando:

this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());
foreach (Control item in this.Controls)
{
if (item.HasChildren)
item.FindAllChildrenByType<TextBox>().ToList().ForEach(t => t.Clear());
}


Isso vai limpar todos os textbox, de qualquer container.
JABA 16/06/2016 19:16:24
#463661
Acho que o seu código ficou bem mais complexo, e o código abaixo, além de mais simples, possui praticamente a mesma quantidade de linhas.

public void LimparCampos(Control con)
{
foreach (Control c in con.Controls)
if (c.Controls.Count == 0)
{
if (c is TextBox)
c.Text = string.Empty;
}
else
LimparCampos(c);
}
KERPLUNK 16/06/2016 19:46:45
#463664
Mas por ser um método de extensão, estará disponível em todo e qualquer controle de todos os forms da aplicação.
JORGESALES 16/06/2016 19:52:12
#463665
Pessoal, obrigado a todos que contribuiram.
O código estava certo, usei o código do LuizComino
porque achei mais enchuto, só não estava funcionando
porque as textbox estavam dentro de um frame, vou abrir outro
tópico para entender isso.
Tópico encerrado , respostas não são mais permitidas