none
Obtener valor de un textbox RRS feed

  • Pregunta

  • Buenas tengo un formulario donde tengo 10 textbox con estos nombres

    txtVenc1 ...txtVenc2... asín hasta el 10 que es txtVenc10

    Estos textbox se muestran en función de unos parámetros , lo que intento hacer es obtener el valor del textbox con esta nomenclatura más "grande" que se muestra por pantalla.

    Ejemplo.

    Si tengo visibles

    txtVenc1 , txtVenc3 y txtVenc5 el "mayor" seria el que tiene el "5" en la coletilla , pues me gustaria obtener el valor de este.

    Estoy dándole vueltas con linq y no veo como hacerlo.

    Gracias

    lunes, 27 de febrero de 2017 10:28

Respuestas

  • Hola golfgti6,

    Mencionas 'si tengo visibles', estás utilizando la propiedad Visible ? En caso sea correcto debes obtener los controles TextBox que comiencen con "txtVenc" y que sean visibles.

    - Sería conveniente que obtengas el control directamente.

    TextBox txt = this.Controls.OfType<TextBox>().
                        Where(t => t.Name.StartsWith("txtVenc") && t.Visible == true).
                        OrderByDescending(t => Convert.ToInt32(t.Name.Replace("txtVenc", ""))).
                        FirstOrDefault();
    
    if (txt != null)
        MessageBox.Show(string.Format("El valor del TextBox mayor es : {0}", txt.Text));

    ¿Por qué conviertes a Int32Si ordeno mediante en nombre en cadena el resultado sería :

    txtVenc1
    txtVenc10
    txtVenc2
    ...

    Por lo que borro la parte del texto y convierto a número para ordenar de mayor a menor, y tomar el primero.

    Si los controles TextBox los agregaste en ese orden (comenzando del 1, 2 ... hasta el 10) podrías usar la propiedad TabIndex.

    TextBox txt = this.Controls.OfType<TextBox>().
                    Where(t => t.Name.StartsWith("txtVenc") && t.Visible == true).
                    OrderByDescending(t => t.TabIndex).
                    First();

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 27 de febrero de 2017 15:15
  • golfgti6,

    Existen varias formas de obtener la referencia, por ejemplo:

    int maxSufijo = this.Controls.OfType<TextBox>().Where(c => c.Name.StartsWith("txtVenc")).
    	Max(x => Convert.ToInt32(x.Name.Substring("txtVenc".Length)));
    
    MessageBox(this.Controls[string.Concat("txtVenc", maxSufijo)].Text);


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 27 de febrero de 2017 13:49
  • Lo que he intentado sin éxito hasta ahora

    Gracias

    int diasVencimiento = Convert.ToInt32(cmbDiasVencimiento.SelectedItem);
    string comp = "txtVenc" + diasVencimiento;
    
    
     string valor = this.Controls.OfType<TextBox>()
                .Where(c => c.Name.StartsWith(comp))
                .First(x => x.Text);





    • Editado golfgti6 lunes, 27 de febrero de 2017 10:41
    • Marcado como respuesta golfgti6 jueves, 9 de marzo de 2017 18:57
    lunes, 27 de febrero de 2017 10:40

Todas las respuestas

  • Lo que he intentado sin éxito hasta ahora

    Gracias

    int diasVencimiento = Convert.ToInt32(cmbDiasVencimiento.SelectedItem);
    string comp = "txtVenc" + diasVencimiento;
    
    
     string valor = this.Controls.OfType<TextBox>()
                .Where(c => c.Name.StartsWith(comp))
                .First(x => x.Text);





    • Editado golfgti6 lunes, 27 de febrero de 2017 10:41
    • Marcado como respuesta golfgti6 jueves, 9 de marzo de 2017 18:57
    lunes, 27 de febrero de 2017 10:40
  • golfgti6,

    Existen varias formas de obtener la referencia, por ejemplo:

    int maxSufijo = this.Controls.OfType<TextBox>().Where(c => c.Name.StartsWith("txtVenc")).
    	Max(x => Convert.ToInt32(x.Name.Substring("txtVenc".Length)));
    
    MessageBox(this.Controls[string.Concat("txtVenc", maxSufijo)].Text);


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    lunes, 27 de febrero de 2017 13:49
  • Hola golfgti6,

    Mencionas 'si tengo visibles', estás utilizando la propiedad Visible ? En caso sea correcto debes obtener los controles TextBox que comiencen con "txtVenc" y que sean visibles.

    - Sería conveniente que obtengas el control directamente.

    TextBox txt = this.Controls.OfType<TextBox>().
                        Where(t => t.Name.StartsWith("txtVenc") && t.Visible == true).
                        OrderByDescending(t => Convert.ToInt32(t.Name.Replace("txtVenc", ""))).
                        FirstOrDefault();
    
    if (txt != null)
        MessageBox.Show(string.Format("El valor del TextBox mayor es : {0}", txt.Text));

    ¿Por qué conviertes a Int32Si ordeno mediante en nombre en cadena el resultado sería :

    txtVenc1
    txtVenc10
    txtVenc2
    ...

    Por lo que borro la parte del texto y convierto a número para ordenar de mayor a menor, y tomar el primero.

    Si los controles TextBox los agregaste en ese orden (comenzando del 1, 2 ... hasta el 10) podrías usar la propiedad TabIndex.

    TextBox txt = this.Controls.OfType<TextBox>().
                    Where(t => t.Name.StartsWith("txtVenc") && t.Visible == true).
                    OrderByDescending(t => t.TabIndex).
                    First();

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI

    lunes, 27 de febrero de 2017 15:15