CONTROLES DENTRO DE UM FRAME
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).
Para chamar a função eu uso:
Mais uma vez agradeço a todos.
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.
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);
}
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;
}
JABA, não funcionou, testei o segundo código
Só pega as testbox fora do Groupbox.
Só pega as testbox fora do Groupbox.
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.
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.
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...
Mas este código sem dúvidas será usado neste projeto e em todos os outros
que farei daqui pra frente.
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.
é 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:
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.
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.
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.
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;
}
Obrigado meus amigos, deu certo aqui, o código do Kerplunk ficará
arquivado para estudar futuramente...
arquivado para estudar futuramente...
Tópico encerrado , respostas não são mais permitidas