none
Validar ingreso de letras Y numeros en VB.NET 2005

    Question

  • Hola a todos. Necesito plantearles la siguiente duda:

    Trabajo en Visual Basic.NET 2005 y me han enseñado a validar Texbox bajo evento KeyPress. Puedo validar que se ingrese Solo numeros, o Solo Letras.
    El problema viene cuando necesito ingresar ambos datos, y ademas Simbolos. A modo de Ejemplo, el Rut o Cedula de identidad del Trabajador, que es:

    11.111.111-1

    La validacion no me permite ingresar ni los puntos ni los guiones, y es un punto clave en la busqueda de perfiles del sistema que quiero construir.
    Alguien sabe como lograrlo?

    Les incluyo Codigo de ejemplo:

     Private Sub txt_rut_reg_tra_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txt_rut_reg_tra.KeyPress
            If e.KeyChar.IsLetterOrDigit(e.KeyChar) Then
                e.Handled = False
            ElseIf e.KeyChar.IsControl(e.KeyChar) Then
                e.Handled = False
                If e.KeyChar = Chr(13) And txt_rut_reg_tra.Text <> Chr(32) Then
                    txt_nom_reg_tra.Enabled = True
                    txt_nom_reg_tra.Focus()
                End If
            Else
                MessageBox.Show("Ingrese Rut Correctamente", "Registro Trabajador", MessageBoxButtons.OK, MessageBoxIcon.Error)
                e.Handled = True
                txt_rut_reg_tra.Text = ""
                txt_rut_reg_tra.Focus()
            End If
        End Sub
    De antemano, Gracias por la ayuda.-
    Wednesday, July 22, 2009 6:11 AM

Answers

  • Hola Venice Aqui te dejo un ejemplo  Donde En el textbox se permiten usar la teclas Numericas y Los Signos Como '@' , '_' , y otros (solo permite los signos que se encuentran al Hcerla combinacion de la tecla Shift y el signo Eje. Shift + @ ) y el punto tambien permite que si te equivocastes en un numero y lo deseas borrar puesto que tiene activada la tecla Back(Borrar un caracter) si el textbox es mayor que CERO , la tecla Space para dar espacios si lo prefieres.


    Bueno espero analizes este codigo y espero te ayude y si hay preguntas Te Contestaremos en Seguida

    Para ello puedes crear un nuevo proyecto y Agregar un textBox al formulario y y bueno fuera de cualquier declaracion Sud Private Public u otra agrega el siguiente codigo dentro del Form



        
       Dim NumerosYaescritos As String 'Extraera los numeros que ya se han escrito por si se introduce una letra o caracter no numerico volverlo a poner en el textbox
    
        '''<summary>
        '''Permite que el Textbox solo acepte Numeros
        ''' </summary>
        ''' <param name="TextBoxs">Nombre del TextBox que quiere validar para que acepte numeros </param>
        ''' <param name="e">Pase la letra 'e' como valor en el evento KeyUp</param>
        ''' <remarks></remarks>
        Private Shadows Sub KeyUp(ByVal TextBoxs As System.Windows.Forms.TextBox, ByVal e As System.Windows.Forms.KeyEventArgs)
    
            'Teclas que Utilizaremos El cual solo son las numericas
            If e.KeyData = Keys.Space Or e.KeyData = Keys.Decimal Or e.KeyData = Keys.Subtract Or _
             e.KeyData = Keys.NumPad0 Or e.KeyData = Keys.NumPad1 Or e.KeyData = Keys.NumPad2 Or e.KeyData = Keys.NumPad3 _
               Or e.KeyData = Keys.NumPad4 Or e.KeyData = Keys.NumPad5 Or e.KeyData = Keys.NumPad6 Or _
               e.KeyData = Keys.NumPad7 Or e.KeyData = Keys.NumPad8 Or e.KeyData = Keys.NumPad9 _
               Or e.KeyData = Keys.D0 Or e.KeyData = Keys.D1 Or e.KeyData = Keys.D2 Or e.KeyData = Keys.D3 Or _
               e.KeyData = Keys.D4 Or e.KeyData = Keys.D5 Or e.KeyData = Keys.D6 _
               Or e.KeyData = Keys.D7 Or e.KeyData = Keys.D8 Or e.KeyData = Keys.D9 Or e.KeyData = Keys.ShiftKey Or _
               e.KeyValue = 50 Or e.KeyValue = 189 Then
    
                'igualamos la variable GetNumbersAlreadyWrite al valor del TextBox.Text
                Dim GetNumbersAlreadyWrite As String = TextBoxs.Text
    
                'Agregamos el valor de la vaoriable GetNumbersAlreadyWrite al la variable  NumerosYaescritos
                NumerosYaescritos = GetNumbersAlreadyWrite
    
                'Programamos la tecla de Retroceso en el textbox
            ElseIf e.KeyData = Keys.Back And TextBoxs.Text.Length > 0 Then
                On Error Resume Next
                'Removemos un caracter mediante se presione la tecla Back
                TextBoxs.Text.Remove(TextBoxs.SelectionStart - 1)
    
                'si el textbox es menor que un caracter
            ElseIf TextBoxs.Text.Length < 1 Then
                'ponemos el textbox En Blanco
                TextBoxs.Text = String.Empty
                'ponemos la variable    NumerosYaescritos en Blanco
                NumerosYaescritos = String.Empty
    
    
            Else
                'ponemos el textbox enblanco
                TextBoxs.Text = String.Empty
                'igualamos el textbox.text a la variable que tienen solo numeros que ateriormente se los agregamos
                TextBoxs.Text = NumerosYaescritos
                'ponemos el cursor de palpiteo en el ultimo caracter del textbox para continuar escribiendo desde ese punto
                TextBoxs.SelectionStart = TextBoxs.Text.Length
    
    
                'Hacemos Sonar un Beep para indicarle al usuario que ha presionado un caracter y no un Numero
                Beep()
    
    
    
            End If
    
        End Sub



    ahora que ya agregamos el codigo llamaremos El Sub desde el evento KeyUp del TextBox

    Para ello agrega el siguiente codigo

     Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
            'pasamos  los parametros al sub KeyUp que creamos
            Me.KeyUp(Me.TextBox1, e)
        End Sub


    Ahora Ejecuta el proyecto y Escibe Letras en el textbox y veras que no seran permitidas y sonara un Beep en senal de Error , ahora escribe numeros y veras que se permitiran , ahora has una coambiancion de tecla Shift + @ y veras que tambien sera permitido tanto tambien como la combinacion  del la teclas Shift + _
     y bueno escribe numeros y despues escribe letras vetas que no se aceptaran las teclas y entoces la variable NumerosYaescritos Nos devolevera una copia del textbox el cual solo tendra los Numeros y asi solo se aceptaran numeros, signos y El Punto y la tecla Back y la tecla  Space y no letras.

    Nota : la sub   Me.KeyUp(Me.TextBox1, e) pasamos como valor el textbox1 y la letra e que contiene Lo necesario del evento KeyUp

    para cada textbox que tengas en el formuario y quieres que solo acepte numeros , ejemplo si tienes un  textbox2 pasa el codigo Me.KeyUp(Me.TextBox2, e)  siempre en el evento TextBox2_KeyUp del textBox2



    Bueno espero te Ayude este comentario y si te ayuda lo puedes marcar como repuesta

    Saludos

    Melvin.

    U.S.A

    Todo Es posible si se studia con exfuerso no importando los de mas Dios esta con nosotros y no hay mas sabiduria que la de Dios, Everything is posible if you study a lot wiht esforce , God Loves us and there isn't anybody like God.... Melvin Saludos
    • Edited by Melvindev Thursday, July 23, 2009 11:14 PM
    • Proposed as answer by Melvindev Friday, July 24, 2009 12:09 AM
    • Marked as answer by Venice Friday, August 07, 2009 3:48 AM
    Thursday, July 23, 2009 11:08 PM

All replies

  • Porque no utilizas una expresion regular en el caso que cuentas es mas eficiente. No la he probado  pero seria de la forma

    [0-9]{2}[.][0-9]{3}[.][0-9]{3}[-][0-9]

    Para comprobarlo if (new Regex("[0-9]{2}[.][0-9]{3}[.][0-9]{3}[-][0-9]").Match(valor).Success)


    Oscar Avarez Guerras - Arquitecto Software en I3B (I+D+I) Blog:http://geeks.ms/blogs/oalvarez Por favor marca como respuesta si te ha ayudado esta respuesta
    Wednesday, July 22, 2009 6:22 AM
  • Hola:

    Si tu intención es que solamente se puedan escribir números, además del punto (.) y guión (-), en el evento KeyPress del control TextBox ejecutarías algo parecido a lo siguiente:

       Private Sub txt_rut_reg_tra_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles txt_rut_reg_tra.KeyPress

            ' Carácter tecleado
            '
            Dim c As Char = e.KeyChar

            If Not Char.IsDigit(c) Then
                Select Case c
                    Case "."c, "-"c
                        ' Sin implementación

                    Case Chr(8)
                        ' Tecla retroceso

                    Case Else
                        e.Handled = True
                        MessageBox.Show("Ingrese Rut Correctamente", "Registro Trabajador", MessageBoxButtons.OK, MessageBoxIcon.Error)

                End Select
            End If

        End Sub

    Por supuesto, tendrías que tener en cuenta donde se coloca el guión (-), y que éste no se repita, así como la longitud de la Cedula de identidad del Trabajador, porque digo yo que tendrá una longitud concreta.


    Un saludo

    P.D.: Si la respuesta te ha servido para resolver el problema, no olvides marcala como satisfactoria. ¿OK?


    Enrique Martínez [MS MVP - VB]
    Wednesday, July 22, 2009 9:06 AM
  • Hola:

    Si tu intención es que solamente se puedan escribir números, además del punto (.) y guión (-), en el evento KeyPress del control TextBox ejecutarías algo parecido a lo siguiente:

       Private Sub txt_rut_reg_tra_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs) Handles txt_rut_reg_tra.KeyPress

            ' Carácter tecleado
            '
            Dim c As Char = e.KeyChar

            If Not Char.IsDigit(c) Then
                Select Case c
                    Case "."c, "-"c
                        ' Sin implementación

                    Case Chr(8)
                        ' Tecla retroceso

                    Case Else
                        e.Handled = True
                        MessageBox.Show("Ingrese Rut Correctamente", "Registro Trabajador", MessageBoxButtons.OK, MessageBoxIcon.Error)

                End Select
            End If

        End Sub

    Por supuesto, tendrías que tener en cuenta donde se coloca el guión (-), y que éste no se repita, así como la longitud de la Cedula de identidad del Trabajador, porque digo yo que tendrá una longitud concreta.


    Un saludo

    P.D.: Si la respuesta te ha servido para resolver el problema, no olvides marcala como satisfactoria. ¿OK?


    Enrique Martínez [MS MVP - VB]

    Muchas gracias por responder.. En cuanto pueda pruebo el codigo y respondo, que ahora estoy trabajando en otro proyecto ;)
    En relacion a escribir solo nuemeros, y agregarle guion, no me sirve mucho en el sentido de que en el teextbox Email debo ingresar letras, numeros y Arroba..

    Debería hacer algo parecido?
    Thursday, July 23, 2009 4:29 PM
  • "Venice" escribió:

    > En relacion a escribir solo nuemeros, y agregarle guion, no me sirve
    > mucho en el sentido de que en el teextbox Email debo ingresar
    > letras, numeros y Arroba..
    >
    > Debería hacer algo parecido?

    ¡Bueno! Yo me límite al formato que deseas que tenga la Cédula de Identidad del Trabajador, que según comentastes era 11.111.111-1

    Ahora bien, si tienes otro control de texto que admite otros caracteres distintos, tendrás que adaptar el ejemplo a las nuevas necesidades.

    De todas maneras, te diré que tienes que diferenciar entre validar el carácter pulsado por el usuario y validar el contenido completo del control TextBox. Para lo primero, tendrás que detectar el carácter pulsado en el evento KeyPress del control; para lo segundo, tendrás que utilizar los eventos de validación del que dispone el propio control TextBox, y para ello, bien te puede servir hacer uso de las "expresiones regulares".


    Enrique Martínez [MS MVP - VB]
    • Proposed as answer by kakaroto2012 Friday, July 24, 2009 11:27 AM
    Thursday, July 23, 2009 4:42 PM
  • en el evento keypress

            'Solo deja entrar Números

            If InStr("0123456789", e.KeyChar) = False Then

                If (Asc(e.KeyChar)) <> 8 And (Asc(e.KeyChar)) <> 46 And (Asc(e.KeyChar)) <> 45 Then

                    e.Handled = True

                End If

            End If

     

                                              'si quieres que entras mas cosas agregalas al if  de arriba por ejemplo
           
    'Ascii

            '8  = Retroceso

            '45 = guion/Negativo -

            '46 = Punto Decimal

            '47 = Diagonal

            '58 = dos Puntos Decimales


    cualquier caracter que quieres es posible solo manda un mmsgbox antes de todo el código
    para que te diga que numero ascii corresponde

    msgbox((Asc(e.KeyChar)) ' presiona cualquier tecla para que sepas el numero ascii

    • Proposed as answer by kakaroto2012 Thursday, July 23, 2009 7:07 PM
    Thursday, July 23, 2009 7:05 PM
  • Hola Venice

     

    Lo que puedes hacer tambien es crear funciones ya sean locales a la forma o en un modulo global para que puedas utilizarlas desde otras formas o aplicaciones. Tu evento KeyPress quedaria como sigue:

     

    Private Sub Numeros_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtSplit_A.KeyPress, txtSplit_De.KeyPress

    e.KeyChar = Chr(gf_Decimales(Asc(e.KeyChar)))

     

    End Sub


     

    Private Sub Email_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles txtEmail.KeyPress

    e.KeyChar = Chr(gf_Emails(Asc(e.KeyChar)))

     

    End Sub


    Y las funciones serian:

     

    Public Function gf_Decimales(ByVal Tecla As Integer) As Integer

     

    '************************************************************************

     

    ' Función : gf_Decimales

     

    ' Descripción : Valida que solo se capturen: {.}, {0-9}

     

    ' Parámetros :

     

    ' Tecla : Variable donde se deposita el valor KeyAscii

     

    ' Valor Devuelto :

     

    ' Valor Ascii: Si la tecla pulsada fué {.}, {0-9}

     

    ' 0 : Si la tecla pulsada fué diferente de {.}, {0-9}

     

    ' Desarrolló : Francisco Miranda Angel

     

    ' F. Creación : 30 de Septiembre de 2008

     

    '************************************************************************

     

       Select

     

       Select

       Select

     

    Case Tecla

     

          Case 8 To 10, 13

     

          Case 46, 48 To 57

     

          Case Else

             Tecla = 0

     

       End Select

     

       Return Tecla

     

    End Function

     

    Public Function gf_Email(ByVal Tecla As Integer) As Integer

     

    '************************************************************************

     

    ' Función : gf_Email

     

    ' Descripción : Valida que solo se capturen: {0-9},{-._@},{A-Z},{a-z}

     

    ' Parámetros :

     

    ' Tecla : Variable donde se deposita el valor KeyAscii

     

    ' Valor Devuelto :

     

    ' Valor Ascii: Si la tecla pulsada fué {0-9},{-._@},{A-Z},{a-z}

     

    ' 0 : Si la tecla pulsada fué diferente de {0-9},{-._@},{A-Z},{a-z}

     

    ' Desarrolló : Francisco Miranda Angel

     

    ' F. Creación : 05 de Junio de 2009

     

    '************************************************************************

     

       Select

     

       Select

       Select

     

    Case Tecla

     

          Case 8 To 10, 13

     

          Case 45, 46, 48 To 57, 64 To 90

     

          Case 97 To 122

     

          Case Else

             Tecla = 0

     

       End Select

     

       Return Tecla

     

    End Function

    Y asi puedes crear cuantas funciones necesites de acuerdo a los datos que necesites, espero que te sirva la opcion que te doy.

    Salu2

    Thursday, July 23, 2009 7:44 PM
  • Hola Venice Aqui te dejo un ejemplo  Donde En el textbox se permiten usar la teclas Numericas y Los Signos Como '@' , '_' , y otros (solo permite los signos que se encuentran al Hcerla combinacion de la tecla Shift y el signo Eje. Shift + @ ) y el punto tambien permite que si te equivocastes en un numero y lo deseas borrar puesto que tiene activada la tecla Back(Borrar un caracter) si el textbox es mayor que CERO , la tecla Space para dar espacios si lo prefieres.


    Bueno espero analizes este codigo y espero te ayude y si hay preguntas Te Contestaremos en Seguida

    Para ello puedes crear un nuevo proyecto y Agregar un textBox al formulario y y bueno fuera de cualquier declaracion Sud Private Public u otra agrega el siguiente codigo dentro del Form



        
       Dim NumerosYaescritos As String 'Extraera los numeros que ya se han escrito por si se introduce una letra o caracter no numerico volverlo a poner en el textbox
    
        '''<summary>
        '''Permite que el Textbox solo acepte Numeros
        ''' </summary>
        ''' <param name="TextBoxs">Nombre del TextBox que quiere validar para que acepte numeros </param>
        ''' <param name="e">Pase la letra 'e' como valor en el evento KeyUp</param>
        ''' <remarks></remarks>
        Private Shadows Sub KeyUp(ByVal TextBoxs As System.Windows.Forms.TextBox, ByVal e As System.Windows.Forms.KeyEventArgs)
    
            'Teclas que Utilizaremos El cual solo son las numericas
            If e.KeyData = Keys.Space Or e.KeyData = Keys.Decimal Or e.KeyData = Keys.Subtract Or _
             e.KeyData = Keys.NumPad0 Or e.KeyData = Keys.NumPad1 Or e.KeyData = Keys.NumPad2 Or e.KeyData = Keys.NumPad3 _
               Or e.KeyData = Keys.NumPad4 Or e.KeyData = Keys.NumPad5 Or e.KeyData = Keys.NumPad6 Or _
               e.KeyData = Keys.NumPad7 Or e.KeyData = Keys.NumPad8 Or e.KeyData = Keys.NumPad9 _
               Or e.KeyData = Keys.D0 Or e.KeyData = Keys.D1 Or e.KeyData = Keys.D2 Or e.KeyData = Keys.D3 Or _
               e.KeyData = Keys.D4 Or e.KeyData = Keys.D5 Or e.KeyData = Keys.D6 _
               Or e.KeyData = Keys.D7 Or e.KeyData = Keys.D8 Or e.KeyData = Keys.D9 Or e.KeyData = Keys.ShiftKey Or _
               e.KeyValue = 50 Or e.KeyValue = 189 Then
    
                'igualamos la variable GetNumbersAlreadyWrite al valor del TextBox.Text
                Dim GetNumbersAlreadyWrite As String = TextBoxs.Text
    
                'Agregamos el valor de la vaoriable GetNumbersAlreadyWrite al la variable  NumerosYaescritos
                NumerosYaescritos = GetNumbersAlreadyWrite
    
                'Programamos la tecla de Retroceso en el textbox
            ElseIf e.KeyData = Keys.Back And TextBoxs.Text.Length > 0 Then
                On Error Resume Next
                'Removemos un caracter mediante se presione la tecla Back
                TextBoxs.Text.Remove(TextBoxs.SelectionStart - 1)
    
                'si el textbox es menor que un caracter
            ElseIf TextBoxs.Text.Length < 1 Then
                'ponemos el textbox En Blanco
                TextBoxs.Text = String.Empty
                'ponemos la variable    NumerosYaescritos en Blanco
                NumerosYaescritos = String.Empty
    
    
            Else
                'ponemos el textbox enblanco
                TextBoxs.Text = String.Empty
                'igualamos el textbox.text a la variable que tienen solo numeros que ateriormente se los agregamos
                TextBoxs.Text = NumerosYaescritos
                'ponemos el cursor de palpiteo en el ultimo caracter del textbox para continuar escribiendo desde ese punto
                TextBoxs.SelectionStart = TextBoxs.Text.Length
    
    
                'Hacemos Sonar un Beep para indicarle al usuario que ha presionado un caracter y no un Numero
                Beep()
    
    
    
            End If
    
        End Sub



    ahora que ya agregamos el codigo llamaremos El Sub desde el evento KeyUp del TextBox

    Para ello agrega el siguiente codigo

     Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
            'pasamos  los parametros al sub KeyUp que creamos
            Me.KeyUp(Me.TextBox1, e)
        End Sub


    Ahora Ejecuta el proyecto y Escibe Letras en el textbox y veras que no seran permitidas y sonara un Beep en senal de Error , ahora escribe numeros y veras que se permitiran , ahora has una coambiancion de tecla Shift + @ y veras que tambien sera permitido tanto tambien como la combinacion  del la teclas Shift + _
     y bueno escribe numeros y despues escribe letras vetas que no se aceptaran las teclas y entoces la variable NumerosYaescritos Nos devolevera una copia del textbox el cual solo tendra los Numeros y asi solo se aceptaran numeros, signos y El Punto y la tecla Back y la tecla  Space y no letras.

    Nota : la sub   Me.KeyUp(Me.TextBox1, e) pasamos como valor el textbox1 y la letra e que contiene Lo necesario del evento KeyUp

    para cada textbox que tengas en el formuario y quieres que solo acepte numeros , ejemplo si tienes un  textbox2 pasa el codigo Me.KeyUp(Me.TextBox2, e)  siempre en el evento TextBox2_KeyUp del textBox2



    Bueno espero te Ayude este comentario y si te ayuda lo puedes marcar como repuesta

    Saludos

    Melvin.

    U.S.A

    Todo Es posible si se studia con exfuerso no importando los de mas Dios esta con nosotros y no hay mas sabiduria que la de Dios, Everything is posible if you study a lot wiht esforce , God Loves us and there isn't anybody like God.... Melvin Saludos
    • Edited by Melvindev Thursday, July 23, 2009 11:14 PM
    • Proposed as answer by Melvindev Friday, July 24, 2009 12:09 AM
    • Marked as answer by Venice Friday, August 07, 2009 3:48 AM
    Thursday, July 23, 2009 11:08 PM