none
Capturar solo números y letras en un Textbox Silverlight 5.0 RRS feed

  • Pregunta

  • Hola, estoy haciendo una aplicación en Silverlight 5 (mi primera), y tengo el típico caso en el que deseo que el usuario solo pueda capturar letras y números en un TextBox, básicamente necesito que NO pueda capturar ningún otro tipo de carácter especial, llámese signos de puntuación, °, |, -, _, etc., solo letras y números.

    Ya busqué mucho ayudas al respecto, pero no encuentro nada que funcione bien en Silverlight, pues hay algunos ejemplos que usan el evento KeyPress y el argumento e.KeyData o e.KeyChar que no existen en Silverlight, y algunos que usan una función muy práctica: Char.IsLetterOrDigit(e.KeyChar), pero no logro hacer que lo que el usuario teclea usarlo como un char para poder usar esta función, recopilando toda esta información la traté de integrar en una solución que me sirviera y ya hice algunas funciones basadas en el evento KeyDown, que sí está en Silverlight:

            public bool bolValidaLetras(System.Windows.Input.Key e)
            {
                if (e == Key.A || e == Key.B || e == Key.C || e == Key.D || e == Key.E || e == Key.F || e == Key.G || e == Key.H || e == Key.I || e == Key.J || e == Key.K
                    || e == Key.L || e == Key.M || e == Key.N || e == Key.O || e == Key.P || e == Key.Q || e == Key.R || e == Key.S || e == Key.T || e == Key.U || e == Key.V
                    || e == Key.W || e == Key.W || e == Key.X || e == Key.Y || e == Key.Z)
                    return true;
                else
                    return false;
            }
    
            public bool bolValidaNumeros(System.Windows.Input.Key e)
            {            
                if (e == Key.D0 || e == Key.D1 || e == Key.D2 || e == Key.D3 || e == Key.D4 || e == Key.D5 || e == Key.D6 || e == Key.D7 || e == Key.D8 || e == Key.D9
                    || e == Key.NumPad0 || e == Key.NumPad1 || e == Key.NumPad2 || e == Key.NumPad3 || e == Key.NumPad4 || e == Key.NumPad5 || e == Key.NumPad6
                    || e == Key.NumPad7 || e == Key.NumPad8 || e == Key.NumPad9)
                    return true;
                else
                    return false;
            }
    
            public bool bolValidaLetrasyNumeros(System.Windows.Input.Key e)
            {
                if (bolValidaLetras(e) || bolValidaNumeros(e))
                    return true;
                else
                    return false;
            }

    y en el evento KeyDown que tiene un argumento KeyEventArgs e, puse:

                if (bolValidaLetrasyNumeros(e.Key))
                    e.Handled = false;
                else
                    e.Handled = true;

    y funciona mas o menos bien, de tal modo que si tecleo por ejemplo un asterisco, no me lo pone y todo va bien, el problema es cuando tecleo shift+algun número, por ejemplo shift+2 que son unas comillas dobles, la función bolValidaNumeros me lo identifica como Key.D2 así que sí me permite capturar las comillas dobles y NO debería

    Este debe ser un requerimiento muuuuy común, ¿alguien lo habrá implementado de alguna otra forma más eficiente?? ¿me podrían ayudar?


    cyndyrdz

    jueves, 9 de enero de 2014 17:12

Respuestas

  • Muchas gracias por las sugerencias, luego de hacer varias pruebas, quedó así:

            private void txtCategoriaEquipo_KeyDown(object sender, KeyEventArgs e)
            {
                // Acepta solo Letras y Números
                if (Valida.bolValidaLetrasyNumeros(e))
                    e.Handled = false;
                else
                    e.Handled = true;
            }

    Y en una clase aparte, para poder utilizarla desde cualquier parte, tengo:

        public class Validaciones
        {
            /// <summary>
            /// Valida que solamente se capturen letras en el TextBox
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es alguna letra y falso si es cualquier otra cosa</returns>
            public bool bolValidaLetras(KeyEventArgs e)
            {
                if (e.Key == Key.A || e.Key == Key.B || e.Key == Key.C || e.Key == Key.D || e.Key == Key.E || e.Key == Key.F || e.Key == Key.G || e.Key == Key.H || e.Key == Key.I || e.Key == Key.J || e.Key == Key.K
                    || e.Key == Key.L || e.Key == Key.M || e.Key == Key.N || e.Key == Key.O || e.Key == Key.P || e.Key == Key.Q || e.Key == Key.R || e.Key == Key.S || e.Key == Key.T || e.Key == Key.U || e.Key == Key.V
                    || e.Key == Key.W || e.Key == Key.W || e.Key == Key.X || e.Key == Key.Y || e.Key == Key.Z )
                    return true;
                else
                    return false;
            }
    
            /// <summary>
            /// Valida que solamente se capturen números en el textbox
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es algun número y falso si es cualquier otra cosa</returns>
            public bool bolValidaNumeros(KeyEventArgs e)
            {
                if (Keyboard.Modifiers == ModifierKeys.Shift)
                    return false;
    
                if (e.Key == Key.D0 || e.Key == Key.D1 || e.Key == Key.D2 || e.Key == Key.D3 || e.Key == Key.D4 || e.Key == Key.D5 || e.Key == Key.D6 || e.Key == Key.D7 || e.Key == Key.D8 || e.Key == Key.D9
                    || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6
                    || e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9)
                    return true;
                else
                    return false;
            }
    
            /// <summary>
            /// Llama a la función que valida Letras y la que valida Números
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es algun número o letra y falso si es cualquier otra cosa</returns>
            public bool bolValidaLetrasyNumeros(KeyEventArgs e)
            {
                if (bolValidaLetras(e) || bolValidaNumeros(e))
                    return true;
                else
                    return false;
            }
        }

    La función para validar solo letras y la función para validar solo números, podrían mandar llamarse en forma individual si se requiere solo Letras o solo Números.

    De esta manera no te permite ni siquiera ingresar un carácter que no sea válido en el TextBox en cuestión.

    Espero que a alguien más le pueda servir, Juan FA, gracias por el apoyo

    Saludos


    cyndyrdz

    lunes, 13 de enero de 2014 16:22

Todas las respuestas

  • Hola

    Yo también soy nuevo en WPF.

    Prueba a utilizar el PreviewTextInput del control, creo que te ira bien

            private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !char.IsDigit(Convert.ToChar(e.Text));
            }

    Saludos

    viernes, 10 de enero de 2014 2:06
  • Muchas gracias por contestar Juan, pero ese evento no existe en un TextBox de Silverlight... :(

    cyndyrdz

    viernes, 10 de enero de 2014 14:57
  • Muchas gracias por contestar Juan, pero ese evento no existe en un TextBox de Silverlight... :(

    cyndyrdz

      Juan, ya lo estuve revisando y me parece que el evento equivalente en Silverlight es el TextInputStart, pero según mis pruebas lo que programo dentro de ese evento sucede después de lo que programo en el evento KeyDown y en este evento KeyDown es donde me funciona que si pongo e.Handled = true, no acepte el caracter tecleado, por lo que aquí debería validarlo para saber si lo acepto o no

    Sigo probando, ya te contaré... Saludos y gracias


    cyndyrdz

    viernes, 10 de enero de 2014 15:29
  • Hola

    Perdona, creo que ando un poco perdido, yo creía que era un proyecto WPF (creía que este era el foro de WPF, donde esta el foro de WPF).

    Y si pruebas en el evento TextBox_TextInput

            private void TextBox_TextInput(object sender, TextCompositionEventArgs e)
            {
                e.Handled = !char.IsDigit(Convert.ToChar(e.Text));
    
            }

    Yo e intentado probarlo pero tengo problemas con la instalación del Silverlight, a sin que no e podido hacer pruebas.

    Saludos

    viernes, 10 de enero de 2014 23:52
  • Por fin lo pude probar, y... no funciona.

    Buscando información, prueba de esta forma

    private void NumClient_KeyDown(object sender, KeyEventArgs e)
    {       
        // Handle Shift case
        if (Keyboard.Modifiers == ModifierKeys.Shift)
        {
           e.Handled = true;
        }
    
        // Handle all other cases
        if (!e.Handled && (e.Key < Key.D0 || e.Key > Key.D9))
        {
            if (e.Key < Key.NumPad0 || e.Key > Key.NumPad9)
            {
                if (e.Key != Key.Back)
                {
                    e.Handled = true;
                }
            }
        }           
    }

    lo e sacado de aquí: http://stackoverflow.com/questions/268207/how-to-create-a-numeric-textbox-in-silverlight

    Suerte y Saludos

    sábado, 11 de enero de 2014 0:40
  • Muchas gracias por el interés y el apoyo, lo pruebo junto con otras opciones que estoy revisando y te comento cómo me fue. Saludos y de nuevo gracias.

    cyndyrdz

    lunes, 13 de enero de 2014 14:41
  • Muchas gracias por las sugerencias, luego de hacer varias pruebas, quedó así:

            private void txtCategoriaEquipo_KeyDown(object sender, KeyEventArgs e)
            {
                // Acepta solo Letras y Números
                if (Valida.bolValidaLetrasyNumeros(e))
                    e.Handled = false;
                else
                    e.Handled = true;
            }

    Y en una clase aparte, para poder utilizarla desde cualquier parte, tengo:

        public class Validaciones
        {
            /// <summary>
            /// Valida que solamente se capturen letras en el TextBox
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es alguna letra y falso si es cualquier otra cosa</returns>
            public bool bolValidaLetras(KeyEventArgs e)
            {
                if (e.Key == Key.A || e.Key == Key.B || e.Key == Key.C || e.Key == Key.D || e.Key == Key.E || e.Key == Key.F || e.Key == Key.G || e.Key == Key.H || e.Key == Key.I || e.Key == Key.J || e.Key == Key.K
                    || e.Key == Key.L || e.Key == Key.M || e.Key == Key.N || e.Key == Key.O || e.Key == Key.P || e.Key == Key.Q || e.Key == Key.R || e.Key == Key.S || e.Key == Key.T || e.Key == Key.U || e.Key == Key.V
                    || e.Key == Key.W || e.Key == Key.W || e.Key == Key.X || e.Key == Key.Y || e.Key == Key.Z )
                    return true;
                else
                    return false;
            }
    
            /// <summary>
            /// Valida que solamente se capturen números en el textbox
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es algun número y falso si es cualquier otra cosa</returns>
            public bool bolValidaNumeros(KeyEventArgs e)
            {
                if (Keyboard.Modifiers == ModifierKeys.Shift)
                    return false;
    
                if (e.Key == Key.D0 || e.Key == Key.D1 || e.Key == Key.D2 || e.Key == Key.D3 || e.Key == Key.D4 || e.Key == Key.D5 || e.Key == Key.D6 || e.Key == Key.D7 || e.Key == Key.D8 || e.Key == Key.D9
                    || e.Key == Key.NumPad0 || e.Key == Key.NumPad1 || e.Key == Key.NumPad2 || e.Key == Key.NumPad3 || e.Key == Key.NumPad4 || e.Key == Key.NumPad5 || e.Key == Key.NumPad6
                    || e.Key == Key.NumPad7 || e.Key == Key.NumPad8 || e.Key == Key.NumPad9)
                    return true;
                else
                    return false;
            }
    
            /// <summary>
            /// Llama a la función que valida Letras y la que valida Números
            /// </summary>
            /// <param name="e">Parametro KeyEventArgs del evento KeyDown del TextBox a validar</param>
            /// <returns>Regresa Verdadero si la captura es algun número o letra y falso si es cualquier otra cosa</returns>
            public bool bolValidaLetrasyNumeros(KeyEventArgs e)
            {
                if (bolValidaLetras(e) || bolValidaNumeros(e))
                    return true;
                else
                    return false;
            }
        }

    La función para validar solo letras y la función para validar solo números, podrían mandar llamarse en forma individual si se requiere solo Letras o solo Números.

    De esta manera no te permite ni siquiera ingresar un carácter que no sea válido en el TextBox en cuestión.

    Espero que a alguien más le pueda servir, Juan FA, gracias por el apoyo

    Saludos


    cyndyrdz

    lunes, 13 de enero de 2014 16:22
  • Una actualización:

            public bool bolValidaLetras(KeyEventArgs e)
            {
                // Con esto aceptamos la Ñ
                if (e.PlatformKeyCode == 192)
                    return true;
    
                if (e.Key == Key.A || e.Key == Key.B || e.Key == Key.C || e.Key == Key.D || e.Key == Key.E || e.Key == Key.F || e.Key == Key.G || e.Key == Key.H || e.Key == Key.I || e.Key == Key.J || e.Key == Key.K
                    || e.Key == Key.L || e.Key == Key.M || e.Key == Key.N || e.Key == Key.O || e.Key == Key.P || e.Key == Key.Q || e.Key == Key.R || e.Key == Key.S || e.Key == Key.T || e.Key == Key.U || e.Key == Key.V
                    || e.Key == Key.W || e.Key == Key.W || e.Key == Key.X || e.Key == Key.Y || e.Key == Key.Z )
                    return true;
                else
                    return false;
            }


    cyndyrdz

    lunes, 13 de enero de 2014 16:50
  • Una actualización:

            public bool bolValidaLetras(KeyEventArgs e)
            {
                // Con esto aceptamos la Ñ
                if (e.PlatformKeyCode == 192)
                    return true;
    
                if (e.Key == Key.A || e.Key == Key.B || e.Key == Key.C || e.Key == Key.D || e.Key == Key.E || e.Key == Key.F || e.Key == Key.G || e.Key == Key.H || e.Key == Key.I || e.Key == Key.J || e.Key == Key.K
                    || e.Key == Key.L || e.Key == Key.M || e.Key == Key.N || e.Key == Key.O || e.Key == Key.P || e.Key == Key.Q || e.Key == Key.R || e.Key == Key.S || e.Key == Key.T || e.Key == Key.U || e.Key == Key.V
                    || e.Key == Key.W || e.Key == Key.W || e.Key == Key.X || e.Key == Key.Y || e.Key == Key.Z )
                    return true;
                else
                    return false;
            }


    cyndyrdz

    Yo he encontrado esta otra forma de hacerlo aceptado la letra "Ñ" y "ñ":

    public void soloLetras(KeyEventArgs e)
            {
                String Aceptados = "QWERTYUIOPASDFGHJKLZXCVBNMÑqwertyuiopasdfghjklzxcv bnmñ " +                Convert.ToChar(8);
    
                if (e.PlatformKeyCode == 192 || Aceptados.Contains("" + e.Key))
                {              
                    e.Handled = false;
                }
                else e.Handled = true;
            }//finSoloLetras

    Espero que le sirva a alguien.


    jueves, 28 de abril de 2016 19:48