none
validar cajas de texto

    Pregunta

  • Hola, a ver si alguien me puede ayudar:

     

    Necesito validar una caja de texto, de forma que solo se puedan meter numeros positivos y negativos con decimales, pero no lo consigo. Lo intento hacer con el siguiente codigo:

     

    private void textoBox1_KeyPress(object sender, KeyPressEventArgs e)

    {

    if ((!char.IsDigit(e.KeyChar)) && (e.KeyChar != (char)Keys.Back) && (e.KeyChar != ','))

    e.Handled = true;

    }

     

    Alguien me puede ayudar?

     

    Gracias

    domingo, 03 de febrero de 2008 23:01

Respuestas

  • mira una forma de realizar estas validaciones es utilizando expresiones regulares y asi el codigo te queda mas elegante y mas legible, ademas que te quitas de arriba todas esas condiciones que a veces son dificil de comprobar, aqui te va un ejemplo y un link para que veas algo de las expresiones regulares.

     

    Code Snippet

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

    {

    if (e.KeyChar == (char)Keys.Back)

    {

    return;

    }

    string expresionRegular = @"^[-]|[0-9]|[\.]$";

    if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), expresionRegular))

    {

    e.Handled = true;

    }

    }

     

    http://msdn2.microsoft.com/en-us/library/1400241x.aspx

    no te olvides que si te  ha sido util mi respuesta marcarla
    saludos

    lunes, 04 de febrero de 2008 0:01
  • eso se lo pones en el KeyPress del textBox que quieres validar

    lunes, 04 de febrero de 2008 1:09
  • Debes atacar la validacion por dos flancos

     

    1- Que solo ingresen los caracteres autorizados

    2- Que esos caracteres tengan un orden logico, es decir no puede aparecer un menos al final o en la mitad y no puede haber mas de un punto...

     

    lo 1ero con key press:

     

    Code Snippet

    string expresionRegular = @"^-|[0-9]|\.$";

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

    {

    if (e.KeyChar == (char)Keys.Back

    || e.KeyChar == (char)Keys.Delete

    || e.KeyChar == (char)Keys.Left

    || e.KeyChar == (char)Keys.Right

    )

    {

    e.Handled = false;

    }

    else if (!Regex.IsMatch(e.KeyChar.ToString(), expresionRegular))

    {

    e.Handled = true;

    }

    }

     

     

    lo segundo con el evento validating:

     

    Code Snippet

     

    Regex isnumber = new Regex(@"^-?[0-9]+(\.?[0-9]+)?$");

     

    private void textBox1_Validating(object sender,

    System.ComponentModel.CancelEventArgs e)

    {

    if (isnumber.IsMatch(textBox1.Text) )

    {

    e.Cancel = false;

    }

    else

    {

    e.Cancel = true;

    }

    }

     

     

    Ahora si quieres algo mas visible solo agrega un Errorprovider en el diseñador de la forma y modifica el codigo asi:

     

    Code Snippet

    Regex isnumber = new Regex(@"^-?[0-9]+(\.?[0-9]+)?$");

     

    private void textBox1_Validating(object sender,

    System.ComponentModel.CancelEventArgs e)

    {

    if (isnumber.IsMatch(textBox1.Text) )

    {

    e.Cancel = false;

    errorProvider1.SetError((Control)sender, "");

    }

    else

    {

    e.Cancel = true;

    errorProvider1.SetError((Control)sender, "Debe ingresar un numero valido");

    }

    }

     

     

     

     

    lunes, 04 de febrero de 2008 16:11
  •  

    Code Snippet

    using System.Text.RegularExpressions;

     

     

    lunes, 04 de febrero de 2008 19:28
  •  mdms Escribió:

    Una ultima cosita,

     

    ¿Como puedo quitar el simbolo del error? es que aunque ponga el valor bien, una vez que se ha introducido un dato invalido, salta el error y luego no lo puedo quitar

     

    Gracias

     

     

    no te entiendo a que te refiere.... pero creo que es esto revisa que este esta linea en el evento de validaciono una similar...:

     

    Code Snippet
     

    e.Cancel = false;

    errorProvider1.SetError((Control)sender, "");

     

     

     

     

    lunes, 04 de febrero de 2008 20:26

Todas las respuestas

  • mira una forma de realizar estas validaciones es utilizando expresiones regulares y asi el codigo te queda mas elegante y mas legible, ademas que te quitas de arriba todas esas condiciones que a veces son dificil de comprobar, aqui te va un ejemplo y un link para que veas algo de las expresiones regulares.

     

    Code Snippet

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

    {

    if (e.KeyChar == (char)Keys.Back)

    {

    return;

    }

    string expresionRegular = @"^[-]|[0-9]|[\.]$";

    if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), expresionRegular))

    {

    e.Handled = true;

    }

    }

     

    http://msdn2.microsoft.com/en-us/library/1400241x.aspx

    no te olvides que si te  ha sido util mi respuesta marcarla
    saludos

    lunes, 04 de febrero de 2008 0:01
  •  

    Hola, muchas gracias por la molestia, he estado mirando las expresiones regulares y la verdad es que estan muy bien, pero el codigo que me mandas no consigo que me funcione, no me hace nada, me sigue permitiendo introducir el dato que quiera, me falta algo?

     

    Gracias

    lunes, 04 de febrero de 2008 0:22
  • eso se lo pones en el KeyPress del textBox que quieres validar

    lunes, 04 de febrero de 2008 1:09
  •  

    Si, mira yo hago esto:

     

    private void tBOrigenX_KeyPress(object sender, KeyPressEventArgs e)

    {

       if (e.KeyChar == (char)Keys.Back)

       {

           return;

       }

       string expresionRegular = @"^[-]|[0-9]|[\.]$";

     

       if (!System.Text.RegularExpressions.Regex.IsMatch(e.KeyChar.ToString(), expresionRegular))

       {

          e.Handled = true;

       }

    }

     

    Pero no me funciona, me deja seguir introduciendo todo tipo de valores, se te ocurre algo?

     

    Gracias

    lunes, 04 de febrero de 2008 1:14
  • mira revisa bien lo que estas haciendo si estas poniendo el codigo en el evento del textBox (lo que querias era entrar numeros con decimales y negativos no?), o si quieres mandame tu proyecto y asi no hacemos tan grande este hilo.

    saludos

    lunes, 04 de febrero de 2008 1:23
  • Debes atacar la validacion por dos flancos

     

    1- Que solo ingresen los caracteres autorizados

    2- Que esos caracteres tengan un orden logico, es decir no puede aparecer un menos al final o en la mitad y no puede haber mas de un punto...

     

    lo 1ero con key press:

     

    Code Snippet

    string expresionRegular = @"^-|[0-9]|\.$";

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)

    {

    if (e.KeyChar == (char)Keys.Back

    || e.KeyChar == (char)Keys.Delete

    || e.KeyChar == (char)Keys.Left

    || e.KeyChar == (char)Keys.Right

    )

    {

    e.Handled = false;

    }

    else if (!Regex.IsMatch(e.KeyChar.ToString(), expresionRegular))

    {

    e.Handled = true;

    }

    }

     

     

    lo segundo con el evento validating:

     

    Code Snippet

     

    Regex isnumber = new Regex(@"^-?[0-9]+(\.?[0-9]+)?$");

     

    private void textBox1_Validating(object sender,

    System.ComponentModel.CancelEventArgs e)

    {

    if (isnumber.IsMatch(textBox1.Text) )

    {

    e.Cancel = false;

    }

    else

    {

    e.Cancel = true;

    }

    }

     

     

    Ahora si quieres algo mas visible solo agrega un Errorprovider en el diseñador de la forma y modifica el codigo asi:

     

    Code Snippet

    Regex isnumber = new Regex(@"^-?[0-9]+(\.?[0-9]+)?$");

     

    private void textBox1_Validating(object sender,

    System.ComponentModel.CancelEventArgs e)

    {

    if (isnumber.IsMatch(textBox1.Text) )

    {

    e.Cancel = false;

    errorProvider1.SetError((Control)sender, "");

    }

    else

    {

    e.Cancel = true;

    errorProvider1.SetError((Control)sender, "Debe ingresar un numero valido");

    }

    }

     

     

     

     

    lunes, 04 de febrero de 2008 16:11
  • Hola y sobre todo muchas gracias.

    El key press me funciona bien, pero para la otra parte me falta algun using y me da el siguiente error:

     

     No se puede encontrar el tipo o el nombre de espacio de nombres 'Regex' (¿falta una directiva using o una referencia de ensamblado?) 

     

    Gracias

    lunes, 04 de febrero de 2008 17:29
  •  

    Code Snippet

    using System.Text.RegularExpressions;

     

     

    lunes, 04 de febrero de 2008 19:28
  • Muchisimas gracias, ya lo tengo solucionado

     

    Un saludo

    lunes, 04 de febrero de 2008 19:40
  • Una ultima cosita,

     

    ¿Como puedo quitar el simbolo del error? es que aunque ponga el valor bien, una vez que se ha introducido un dato invalido, salta el error y luego no lo puedo quitar

     

    Gracias

     

    lunes, 04 de febrero de 2008 20:20
  •  mdms Escribió:

    Una ultima cosita,

     

    ¿Como puedo quitar el simbolo del error? es que aunque ponga el valor bien, una vez que se ha introducido un dato invalido, salta el error y luego no lo puedo quitar

     

    Gracias

     

     

    no te entiendo a que te refiere.... pero creo que es esto revisa que este esta linea en el evento de validaciono una similar...:

     

    Code Snippet
     

    e.Cancel = false;

    errorProvider1.SetError((Control)sender, "");

     

     

     

     

    lunes, 04 de febrero de 2008 20:26
  • Gracias, ya me sale.

     

    Muy amable

    lunes, 04 de febrero de 2008 21:11