none
Texbox con recusividad RRS feed

  • Pregunta

  • Hola estimado Leandro:

    Estoy realizando un desarrollo en donde necesito verificar que un conjunto de 50 TextBox están vacíos o no, lo que puedo hacer es 

    if(txtOrientacion1.Text ="" || txtMedidaEnMetros1.Text ="" || txtDescripcionColindante.Text ="")

    {}

    else

    {

    SumaConstrucciones ++;

    }

    Pero al tener 50 validaciones de cada uno de los TextBox, es sumamente pesado (Para el código como para la aplicación), entonces he intentado esto de forma recursiva:

                                //*Declaro los nombres de mis TextBox                            

                                string Cc = "txtOrientacion";
                                string Bb = "txtMedidaEnMetros";
                                string Aa = "txtDescripcionColindante";

                                 int i; 

                                while (i > 50)

                                {

                                if(Cc + Convert.ToInt32)(i).Text ="" || BbConvert.ToInt32(i).Text ="" || AaConvert.ToInt32(i).Text ="")
                                {}
                                else 
                                {
                                i++;
                                }
                                }

    Lo que quiero hacer es construir es el nombre del textbox: txtOrientacion1.Text="", txtMedidaEnMetros1.Text= "", txtDescripcionColindante1.text=""

    La siguiente linea sería: txtOrientacion2.Text="", txtMedidaEnMetros2.Text= "", txtDescripcionColindante2.text=""

    Si lo hace, pero no valida que efectivamente estén vacios los TextBox, todos me los toma como si estuvieran con información.

    ¿Que puedo hacer para este problemita?

    Agradezco tu ayuda.

    Saludos desde CDMX.

    jueves, 14 de marzo de 2019 16:15

Respuestas

  • Hola. 

    Por más que busque la forma de hacer funcionar tu código a las necesidades del proyecto, no me fue posible, sin embargo encontré esta solución, la comparto por si alguien necesita hacer lo mismo.

    1) Encontrar por nombres (super rapido podrías ponerles dentro del form o algo por el estilo)
    Control[] controles = this.Controls.Find("textBox1", true);
    MessageBox.Show((controles[0] as TextBox).Text);
    2) Forma barrido con foreach (un poco más lento porque se barre todos los controles del form)
    //instancio una lista de controles
    Control.ControlCollection lista = new Control.ControlCollection(this);
    //asigno a la lista de controles todos los controles del formulario
    lista = this.Controls;
    //me barro todos los controles
    foreach (Control item in lista)
    {
    //con esto te obtiene solo los txt y te obtiene todos
    if (item.GetType() == typeof(TextBox))
    {
    //aqui ahces las operacioens que requieras
    MessageBox.Show(item.Text);
    }
    }

    En web:

    for(int i=1;i<=50;i++)
    {
    //ojo ese del this debe ser el contenedor que contenga los 50 txt
    //me supongo que debes tenerlos a todos en un form por eso pongo el this.!!! ok :)
        TextBox txtGenerico = this.FindControl("TextBox"+i.ToString());
    if(txtGenerico != null)
    {
    if(txtGenerico.Text.Length > 0)
    {
    //lo que deseas hacer
    }
    }
    }

    De igual frma, muchisimas gracias por la ayuda.

    Saludos cordiales.

    • Marcado como respuesta AlfredMX viernes, 15 de marzo de 2019 19:10
    viernes, 15 de marzo de 2019 19:10

Todas las respuestas

  • Hola puedes aplicar Linq para ello. Te muestro un ejemplo de como obtener los textboxes vacíos o en blanco

    var vacios = this.Controls.OfType<TextBox>().Where(textBox => string.IsnullOrWhiteSpace(txtBox.Text)) .ToList();


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos


    jueves, 14 de marzo de 2019 16:53
    Moderador
  • De todas formas indicarte que el operador de igualdad en C# es == no un = como estas aplicando. 

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 14 de marzo de 2019 16:56
    Moderador
  • vale y utilizando lo que me comentas, como le asignaría el nombre a cada uno de los controles para hacerlo recursivo, porque al final, necesito validar de inicio 150 textbox?

    var vacios = this.Controls.OfType<TextBox>().Where(textBox???? => string.IsnullOrWhiteSpace(txtBox.Text)) .ToList();

    Gracias por la respuesta.

    jueves, 14 de marzo de 2019 18:13
  • Qué quieres validar? Si hay alguno vacío? Si la lista devuelta contiene elementos entonces es que hay al menos uno vacío. Lo que te he propuesto da igual que haya 1 o 150 textboxes. Recuperas al final los vacíos. Si aplicas la negación a String.IsnullOrWhitespace obtienes los que No lo están. Puedes explicarmealgo más lo que necesitas? 


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 14 de marzo de 2019 18:27
    Moderador
  • Claro que si!

    La solución contiene un tab en donde hay 3 Textbox en cada pestaña(son 50 pestañas), fuera de esos tabs hay mas controles, entre ellos muchos mas Textbox que nada tendrían que ver en la validación, lo que quiero hacer es que al guardar, lo primero que valide la aplicación es que en esos tabs si existe alguno vacío, no lo tome como válida esa pestaña y continúe revisando en las siguientes si hay datos o no!

    Al final, mi validación me va a servir para verificar mas adelante, cuantas pestañas tengo que guardar, para después recuperarlas.

    Mi único problema es que no se como hacer para que mediante un proceso recursivo pueda obtener los nombres de los TextBox que van del 1 al 50 y no tener que hacerlo a manita, es decir esto:

    if(txtOrientacion1.Text =="" || txtMedidaEnMetros1.Text =="" || txtDescripcionColindante.Text =="")

    {}

    else

    {

    SumaConstrucciones ++;

    }

    quiero hacer mediante unas variables obtener el nombre primero (txtOrientacion), despues el número que le corresponde (n) y despues el siguiente que sería el ".Text == """

    Se puede hacer esto?

    Y como podría quedar?

    Gracias nuevamente!

    Este es el tab con las 50 pestañas

    jueves, 14 de marzo de 2019 18:41
  • Hola podrías hacer los siguiente.

    Establece la propiedad Tag del control con un valor. Luego puedes buscar en cada Tab, los TextBoxes que contienen ese Tag y verificar si están vaciós.

    Ejemplo:

    1. En el Tab1 establecemos 3 controles TextBox con Propiedad Tag == "VALIDATE"
    2. Hacer un método que pasado un TabControl, devuelve un bool que indica si existe algún TextBox con propiedad Tag == "VALIDATE"
    private bool HayVaciosEnTab(TabControl tab)
    {
    	return tab.Controls.OfType<TextBox>().Any(textBox => string.IsNullOrWhiteSpace(txtBox.Text) && textBox.Tag == "VALIDATE").ToList();
    }
     
    Uso Any() ya que indica si en una secuencia existe un elemento que cumple la condición indicada.


    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    jueves, 14 de marzo de 2019 21:05
    Moderador
  • Hola. 

    Por más que busque la forma de hacer funcionar tu código a las necesidades del proyecto, no me fue posible, sin embargo encontré esta solución, la comparto por si alguien necesita hacer lo mismo.

    1) Encontrar por nombres (super rapido podrías ponerles dentro del form o algo por el estilo)
    Control[] controles = this.Controls.Find("textBox1", true);
    MessageBox.Show((controles[0] as TextBox).Text);
    2) Forma barrido con foreach (un poco más lento porque se barre todos los controles del form)
    //instancio una lista de controles
    Control.ControlCollection lista = new Control.ControlCollection(this);
    //asigno a la lista de controles todos los controles del formulario
    lista = this.Controls;
    //me barro todos los controles
    foreach (Control item in lista)
    {
    //con esto te obtiene solo los txt y te obtiene todos
    if (item.GetType() == typeof(TextBox))
    {
    //aqui ahces las operacioens que requieras
    MessageBox.Show(item.Text);
    }
    }

    En web:

    for(int i=1;i<=50;i++)
    {
    //ojo ese del this debe ser el contenedor que contenga los 50 txt
    //me supongo que debes tenerlos a todos en un form por eso pongo el this.!!! ok :)
        TextBox txtGenerico = this.FindControl("TextBox"+i.ToString());
    if(txtGenerico != null)
    {
    if(txtGenerico.Text.Length > 0)
    {
    //lo que deseas hacer
    }
    }
    }

    De igual frma, muchisimas gracias por la ayuda.

    Saludos cordiales.

    • Marcado como respuesta AlfredMX viernes, 15 de marzo de 2019 19:10
    viernes, 15 de marzo de 2019 19:10