LIMPAR TEXTBOX DENTRO DE TABCONTROL

JORGESALES 06/04/2017 20:35:31
#473115
Pessoal boa noite, a função abaixo funciona perfeitamente se usada com [txt-color=#0000f0]this.Controls[/txt-color] no lugar de [txt-color=#0000f0]tabControl1.Controls[/txt-color]
, em outras palavras só está pegando as textbox que estão fora do tabControl1.
Eu preciso saber como pegar/localizar todos os controles dentro de um tabControl1.Controls, alguém pode ajudar?
            foreach (Control c in tabControl1.Controls)
{
if (c is TextBox && c.Tag.ToString() == [Ô]obrigatorio[Ô] && c.Text == [Ô][Ô])
MessageBox.Show([Ô]Campos obrigatórios não foram preenchidos![Ô]);
}

Como sempre desde já agradeço a todos que possam ajudar.
Se alguém conhece outro meio de verificar se as texbox estão em branco de maneira
mais didática a sugestão é bem vinda.
O que estou tentando fazer é evitar algo do tipo:
[txt-color=#e80000]if (txtNome.text == [Ô][Ô])
MessageBox.Show([Ô]Campos obrigatórios não foram preenchidos![Ô]);[/txt-color]
para cada texbox que tiver que conferir antes do cadastro.

JABA 06/04/2017 21:00:09
#473117
Eu já te passei isso outra vezes.

public void Limpar_texto(Form frm)
{
foreach (Control item in frm.Controls)
{
if (item is TabControl)
{
foreach (TabPage page in ((TabControl)item).TabPages)
{
foreach (Control control in page.Controls)
{
if (control is TextBox)
control.Text = [Ô][Ô];

}
}
}
}
}


social.msdn.microsoft.com/Forums/pt-BR/b40a9671-f4c6-424b-bf0d-08f0848626cf/limpar-todos-os-campos-tabcontrol-c?forum=vscsharppt

Ou isso:

SeuTabControl.Controls.Clear()

JORGESALES 06/04/2017 21:15:23
#473118
JABA,
O que preciso é algo para identificar uma textbox cujo a Tag seja igual a obrigatório
e que a mesma esteja vazia, tentei adaptar seu código da seguinte maneira:
            foreach (Control item in this.Controls)
{
if (item is TabControl)
{
foreach (TabPage page in ((TabControl)item).TabPages)
{
foreach (Control c in page.Controls)
{
if (c is TextBox && c.Tag.ToString() == [Ô]obrigatorio[Ô] && c.Text == [Ô][Ô])
MessageBox.Show([Ô]Campos obrigatórios não foram preenchidos![Ô]);
}
}
}
}

Mas não acontece nada.
Citação:

:
Eu já te passei isso outra vezes.


Sim meu amigo, a algum tempo atrás logo quando comecei a estudar C#
e é justamente nesse código que estou me inspirando para criar essa função que
até o presente momento só funciona nas textbox's que não estão no tabControl

JABA 06/04/2017 21:27:51
#473120
Coloque um BreakPoint e vai vendo quais controles ele está verificando. Tem que ver onde que ele sai do loop.
JORGESALES 06/04/2017 21:42:21
#473121
Ele passa por todas as texbox mas não faz nada, inclusive coloquei:
                            if (c is TextBox)
c.Text = [Ô][Ô];

só pra ver se limpava mas nada acontece
MARIOANDRADE 06/04/2017 21:44:11
#473122
Resposta escolhida
JABA 06/04/2017 21:59:52
#473123
Se está chegando nas TextBoxs, então o problema deve ser com alguma comparação. Tente algo como:

if (c is TextBox && c.Tag.ToString() == [Ô]obrigatorio[Ô] && string.IsNullOrWhiteSpace(c.text))
JORGESALES 06/04/2017 23:08:11
#473125
JABA,
não acontece nada, usei o código exatamente como você passou mas as
textbox não são limpas:
        private void Form1_Load(object sender, EventArgs e)
{
Limpar_texto(this);
}

public void Limpar_texto(Form frm)
{
foreach (Control item in frm.Controls)
{
if (item is TabControl)
{
foreach (TabPage page in ((TabControl)item).TabPages)
{
foreach (Control control in page.Controls)
{
if (control is TextBox)
control.Text = [Ô][Ô];
}
}
}
}
}

Testei dessa forma porque se funcionasse seria mais fácil para adaptar
para o que pretendo...
JORGESALES 06/04/2017 23:10:10
#473126
Citação:

:
Acho que este link pode ajudar:
http://stackoverflow.com/questions/10728300/check-if-control-is-textbox-within-tabcontrol


Vou testar aqui professor...
KERPLUNK 06/04/2017 23:10:48
#473127
O que eu faria: Um método recursivo que retorne todos os controles de um tipo independente de estar dentro de um container, em um List<T>, assim, posso usar uma expressão lambda. Mais ou menos assim:

public IEnumerable<Control> GetAll(Control control, Type type)
{
var controls = control.Controls.Cast<Control>();

return controls.SelectMany(ctrl => GetAll(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}



E para usar esse método:

foreach (TextBox item in this.GetAll(this, typeof(TextBox)).Where(c => c.Tag.ToString() == [Ô]obrigatorio[Ô]))
{
//aqui faça o que quiser com [Ô]item[Ô], ele vai ser um textbox que contém a [Ô]obrigatorio[Ô] na tag
MessageBox.Show(item.Name);
}

KERPLUNK 06/04/2017 23:20:28
#473128
Você pode até mesmo usar o método GetAll acima, como um método de extensão que se aplicaria à qualquer form que você criar no seu projeto. Além disso, ele serve para buscar por qualquer tipo de controle e fazer com eles o que quiser. Para usar esse método com um método de extensão, seria assim:

public static class Extensions
{
public static IEnumerable<Control> GetAll(this Form form, Control control, Type type)
{
var controls = control.Controls.Cast<Control>();

return controls.SelectMany(ctrl => form.GetAll(ctrl, type))
.Concat(controls)
.Where(c => c.GetType() == type);
}

}


Para usar, é a mesma coisa, mas ele estará disponível em qualquer form do seu projeto. Uma correção, no uso: a propriedade Tag pode estar null, por isso, usamos um operador [Ô]short-circuit[Ô] para testar isso, além de métodos ToUpper(), para equiparar o case, assim, você pode escrever [Ô]obrigatorio[Ô], ou [Ô]OBRIGATORIO[Ô], ou [Ô]ObRiGaToRIO[Ô] que o teste vai funcionar da mesma maneira:

foreach (TextBox item in this.GetAll(this, typeof(TextBox))
.Where(c => c.Tag!= null && c.Tag.ToString().ToUpper() == [Ô]obrigatorio[Ô].ToUpper()))
{
MessageBox.Show(item.Name);
}
Página 1 de 2 [18 registro(s)]
Tópico encerrado , respostas não são mais permitidas