CONTROLES DENTRO DE UM FRAME

JORGESALES 16/06/2016 19:57:25
#463667
Pessoal, conforme comentei no tópico anterior gostaria de saber como usar o código abaixo para
pegar texbox que estaja dentro de um frame: (se possível saber como usar para pegar qualquer controle
que esteja no formulário, mas saber como pegar de um frame em especifico pode ser muito util também).
private bool Validar(Control con)
{
foreach (Control c in con.Controls)
{
if (c is TextBox)
{
if (c.Text == [Ô][Ô])
{return false;}
}
}
return true;
}
}

Para chamar a função eu uso:
         {
if (!Validar(this))
MessageBox.Show([Ô]Campos obrigatórios não foram preechidos![Ô], [Ô]MyFistProject[Ô], MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}

Mais uma vez agradeço a todos.
JABA 16/06/2016 20:05:10
#463668
Resposta escolhida
O código que eu havia postado no outro tópico era justamente pra driblar isso. Cada container é responsável por seus controles, e o seu código só estava lidando com a parte dos controles de camada mais alta do form, por isso ele não funcionava.

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

JABA 16/06/2016 20:21:17
#463670
Dessa forma aqui fica que nem o seu, só que para todos os controles:

private bool Validar(Control con)
{
foreach (Control c in con.Controls) {
if (c.Controls.Count == 0)
{
if (c is TextBox)
if (c.Text == [Ô][Ô]) return false;
}
else
Validar(c);
}
return true;
}
JORGESALES 16/06/2016 21:57:06
#463677
JABA, não funcionou, testei o segundo código
Só pega as testbox fora do Groupbox.
KERPLUNK 16/06/2016 22:00:33
#463678
No outro tópico, passei um exemplo que funciona para todos os textbox dentro do form, indiferente se estão ou não dentro de containers. E por ser um método de extensão, vai funcionar para todos os forms de forma automática, basta colocar o método em uma classe estática em qualquer lugar que não um form, uma classe por exemplo.
JORGESALES 16/06/2016 22:09:42
#463680
Citação:

:
No outro tópico, passei um exemplo que funciona para todos os textbox dentro do form, indiferente se estão ou não dentro de containers. E por ser um método de extensão, vai funcionar para todos os forms de forma automática, basta colocar o método em uma classe estática em qualquer lugar que não um form, uma classe por exemplo.


Vou tentar aqui e posto....
Desde já muito agradecido por sua grande ajuda.
JORGESALES 16/06/2016 22:11:59
#463681
Dei uma olhada, mas acho que este aqui serve para limpar os campos e no momento
eu desejo apenas verificar se eles estão vazios...
this.Controls.OfType<TextBox>().ToList().ForEach(t => t.Clear());

Mas este código sem dúvidas será usado neste projeto e em todos os outros
que farei daqui pra frente.
KERPLUNK 16/06/2016 22:54:52
#463684
é A MESMA COISA. Limpar, verificar, qualquer ação é o mesmo código, muda apenas o que você quer fazer. Por exemplo, para dar uma mensagem e setar o foco no controle vazio:

this.Controls.OfType<TextBox>().ToList().ForEach(t => { if (t.Text == [Ô][Ô]) { t.Focus(); MessageBox.Show([Ô]Controle Vazio[Ô]); } });
foreach (Control item in this.Controls)
{
if (item.HasChildren)
item.FindAllChildrenByType<TextBox>().ToList().ForEach(t => { if (t.Text == [Ô][Ô]) { t.Focus(); MessageBox.Show([Ô]Controle Vazio[Ô]); } });
}


Aquele [Ô]t[Ô] dentro do método ForEach, é uma expressão lambda, que é na verdade um método anônimo e pode-se escrever nele qualquer coisa como um método normal, inclusive mostrar mensagens, setar foco ou qualquer outra coisa que se queira fazer com o objeto. ForEach, percorre todos os objetos do tipo [Ô]TextBox[Ô] dentro do container atual, para cada um, o método é executado e [Ô]t[Ô] representa o objeto atual que é nada mais, nada menos que um TextBox e pode ser tratado como tal. O que fiz, foi [Ô]Se o texto do objeto for [Ô][Ô], dê o foco no controle e exiba uma mensagem. Nessa mensagem, poderia até mesmo incluir informações da Textbox, que pode conter Tags ou até mesmo ser um objeto estendido. As possibilidades são enormes de o que se pode fazer com os controles, mas é preciso entender o que está sendo feito e não me refiro à código.
KERPLUNK 16/06/2016 22:56:41
#463685
O mesmo método de extensão pode conter essa rotina, que vai ser [Ô]herdada[Ô] em todos os controles de todos os forms da sua aplicação. Ou seja, ao invés de ter essa rotina em vários forms, você teria ela em um só lugar e o comportamento seria o mesmo para toda a aplicação, sem nunca precisar de manutenção, à menos que você queira mudar o comportamento dela.
JABA 17/06/2016 11:52:48
#463727
Jorge, dei uma pequena ajustada. Testa aí agora pra ver:

        private bool Validar(Control con)
{
foreach (Control c in con.Controls)
{
if (c.Controls.Count == 0)
{
if (c is TextBox)
if (c.Text == [Ô][Ô]) return false;
}
else
if (!Validar(c)) return false;
}
return true;
}
JORGESALES 17/06/2016 22:48:14
#463759
Obrigado meus amigos, deu certo aqui, o código do Kerplunk ficará
arquivado para estudar futuramente...
Tópico encerrado , respostas não são mais permitidas