none
Problemas con validación de Textbox

    Pregunta

  • Hola comunidad,

    Tengo problemas ala hora de validar un textbox,  las validaciones que implento son:

    Textbox_Vacio()  Validar que el textbox este vacio

    Expresion_Textbox() Validar por medio de una expresion regular, la cadena de caracteres(orden de los numeros negativos (- #...)

    si las validaciones no se cumplen entonces desabilito un boton "Aceptar", de lo contrario lo habilito.

    El problema radica que en el evento validating del textbox , solo me reconoce una validacion, Textbox_Vacio() y la validacion Expresion_Textbox() no me la reconoce es decir, si ingreso en el textbox "-20" me habilita el boton, pero si escribo "20-" no me lo desabilita, la unica manera de que funcione es quitanto la validacion Textbox_Vacio() .

    Aque se debe esto o si se pueden implementar en otro evento del textbox. Saludos.

    Las validaciones implementadas:

    Sub Textbox_Vacio(ByVal tx As TextBox, btn As Button)
    
            If String.IsNullOrWhiteSpace(tx.Text) Then
                btn.Enabled = False
            Else
                btn.Enabled = True
            End If
    
        End Sub
    
    
     Sub Expresion_Textbox(ByVal tx As TextBox, btn As Button)
            Try
                Dim found As Boolean = _
                      Regex.IsMatch(tx.Text, "^-?\d$", RegexOptions.IgnoreCase)
    
                If (found) Then
                    btn.Enabled = False
                Else
                    btn.Enabled = True
    
                End If
    
    
    
    

    sábado, 5 de noviembre de 2016 17:10

Respuestas

  • Jose Alrey,

    Si no colocas el código que tienes implementado es difícil poder indicar donde es que tienes el error.

    A ver, mencionas que tienes varios objetos de tipo TextBox y únicamente se habilitará el botón [Aceptar] cuando todos (los controles TextBox) pasen la validación de manera correcta, ¿verdad?. De ser así, puedes hacer lo siguiente:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
    	'Deshabilitar el botón [Aceptar]
    	btnAceptar.Enabled = False
    
    	'Vincular el evento TextChanged a todos los objetos de tipo TextBox
    	AddHandler txtNum1.TextChanged, AddressOf ValidarTextBox
    	AddHandler txtNum2.TextChanged, AddressOf ValidarTextBox
    	'...
    
    End Sub

    En el ejemplo las cajas de texto se llaman txtNum1, txtNum2, txtNum{n}, y la idea es crear una única función para controlar el evento TextChanged (de todos los objetos de tipo TextBox).

    La función ValidarTextBox() se desencadenará por cada vez que el valor de la propiedad Text -de cualquier caja de texto- cambie.

    Private Sub ValidarTextBox(sender As Object, e As EventArgs)
    
    	Dim Habilitar As Boolean = True
    
    	For Each txt As TextBox In Me.Controls.OfType(Of TextBox).
    			Where(Function(t) t.Name.StartsWith("txtNum"))
    		If Not ValidarContenido(txt.Text) Then
    			Habilitar = False
    			Exit For
    		End If
    	Next
    
    	btnAceptar.Enabled = Habilitar
    
    End Sub

    Puedes obviar la cláusula where en caso quieras validar todos los objetos de tipo TextBox del formulario.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 5 de noviembre de 2016 19:11

Todas las respuestas

  • ¿Donde invocas estos metodos?  (coloca el codigo)
    sábado, 5 de noviembre de 2016 17:16
  • Jose Alrey,

    No creo que sea necesario pasar como parámetro un objeto de tipo TextBox y Button. Por otro lado, la expresión regular que implementas retornará False incluso cuando la longitud de la cadena sea 0, no veo necesidad de hacer doble validación. Podrías simplificar el código de la siguiente manera:

    - Función

    Function ValidarContenido(texto As String) As Boolean
    
    	Return Regex.IsMatch(texto, "^-?\d$", RegexOptions.IgnoreCase)
    
    End Function

    - Invocación

    btn.Enabled = ValidarContenido(TextBox1.Text)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta Jose Alrey sábado, 5 de noviembre de 2016 18:18
    • Desmarcado como respuesta Jose Alrey sábado, 5 de noviembre de 2016 18:18
    sábado, 5 de noviembre de 2016 17:25
  • Redondeando la idea, podrías usar el evento 'TextChanged' para realizar la validación:

    Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
    
    	Button1.Enabled = ValidarContenido(DirectCast(sender, TextBox).Text)
    
    End Sub


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 5 de noviembre de 2016 17:38
  • Hola Willians,tu funcion trabaja perfecto, lo de pasar los parametros es porque son  mas de 8 tetxtbox los que deben ser validados, incluso tu funcion podria calzar en un for each, pero observo que cuando se pierde el foco del textbox el boton se habilita a que se deberá esto?.
    sábado, 5 de noviembre de 2016 18:36
  • Jose Alrey,

    Si no colocas el código que tienes implementado es difícil poder indicar donde es que tienes el error.

    A ver, mencionas que tienes varios objetos de tipo TextBox y únicamente se habilitará el botón [Aceptar] cuando todos (los controles TextBox) pasen la validación de manera correcta, ¿verdad?. De ser así, puedes hacer lo siguiente:

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    
    	'Deshabilitar el botón [Aceptar]
    	btnAceptar.Enabled = False
    
    	'Vincular el evento TextChanged a todos los objetos de tipo TextBox
    	AddHandler txtNum1.TextChanged, AddressOf ValidarTextBox
    	AddHandler txtNum2.TextChanged, AddressOf ValidarTextBox
    	'...
    
    End Sub

    En el ejemplo las cajas de texto se llaman txtNum1, txtNum2, txtNum{n}, y la idea es crear una única función para controlar el evento TextChanged (de todos los objetos de tipo TextBox).

    La función ValidarTextBox() se desencadenará por cada vez que el valor de la propiedad Text -de cualquier caja de texto- cambie.

    Private Sub ValidarTextBox(sender As Object, e As EventArgs)
    
    	Dim Habilitar As Boolean = True
    
    	For Each txt As TextBox In Me.Controls.OfType(Of TextBox).
    			Where(Function(t) t.Name.StartsWith("txtNum"))
    		If Not ValidarContenido(txt.Text) Then
    			Habilitar = False
    			Exit For
    		End If
    	Next
    
    	btnAceptar.Enabled = Habilitar
    
    End Sub

    Puedes obviar la cláusula where en caso quieras validar todos los objetos de tipo TextBox del formulario.



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    sábado, 5 de noviembre de 2016 19:11
  • Excelente maestro funciona perfecto! muchas gracias por tu ayuda, marcada como respuesta. Saludos.
    sábado, 5 de noviembre de 2016 20:27