none
CONTROLAR DOS EVENTOS RRS feed

  • Pregunta

  • Hola tengo un pequeño inconveniente con un formulario en cuanto al manejo de eventos.

    Al momento de cargar el formulario he cargado un string con las cedulas de todos los usuarios ya registrados en Base de datos llamado arreglo()

    En el formulario existe un textbox que recibe la cedula de la persona. Este campo tiene las siguientes restricciones

    1) Envio el arreglo y demas componentes del formulario para hacer advertencias al usuario.  De esta forma (" EN EL EVENTO LEAVE ")

    1 Private Sub TXTCEDULA_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TXTCEDULA.Leave
    2        ValidaBtn.ErrorCedula(arreglo, BTNGUARDAR, My.Resources.NuevoUsuarioGuardar_0, My.Resources.NuevoUsuarioGuardarDeshabili_0, LBLVALIDACEDULA, TXTCEDULA)
    3 End Sub
    4 Sub ErrorCedula(ByVal a() As String, ByRef b As System.Windows.Forms.Button, ByVal c As System.Drawing.Bitmap, ByVal d As System.Drawing.Bitmap, ByRef e As Windows.Forms.Label, ByVal f As Windows.Forms.TextBox)
    5        If (f.Text <> "") Then
    6            For i = 0 To a.Length - 1
    7                If (f.Text = a(i)) Then
    8                    e.Text = "Error. La persona ya se encuentra registrada"
    9                    MsgBox("Verifique el número de cedula. La persona ya se encuentra registrada", MsgBoxStyle.Information, Title:="ERROR")
    10                    b.Enabled = False
    11                    b.BackgroundImage = d
    12                    Exit Sub
    13                End If
    14            Next
    15            e.Text = ""
    16            b.Enabled = True
    17            b.BackgroundImage = c
    18        Else
    19            e.Text = "Error. Es preciso registrar información en el campo cédula"
    20            MsgBox("Verifique el formulario no se ha registrado número de cédula", MsgBoxStyle.Information, Title:="ERROR")
    21            b.Enabled = False
    22            b.BackgroundImage = d
    23        End If
    24    End Sub

    Lo que hago es habilitar o deshabilitar el boton guardar, repintar el boton guardar, establecer valores a un label como advertencias.  Todo esto si no se encuentra registrado ningun valor en la cedula o la cédula ya se encuentra registrada.  

    2) Valido el ingreso de informacion por parte del usuario (solo numeros y transferir el foco al pulsar enter) (EN EL EVENTO KEYPRESS)

    25 Private Sub TXTCEDULA_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TXTCEDULA.KeyPress
    26        ValidaTxt.Numeros(e, TXTNOMBRES)
    27 End Sub
    28 Sub Numeros(ByRef e As System.Windows.Forms.KeyPressEventArgs, ByRef b As System.Windows.Forms.TextBox)
    29        Dim a As Integer
    30        a = Asc(e.KeyChar)
    31        If ((a < 48) Or (a > 57)) And (a <> 8) And (a <> 127) And (a <> 13) Then
    32            MsgBox("Es preciso digitar números", MsgBoxStyle.Information, Title:="ERROR")
    33            e.Handled = True
    34        End If
    35        If a = 13 Then
    36            b.Focus()
    37            e.Handled = True
    38        End If
    39    End Sub

    TODO FUNCIONA PERFECTAMENTE PERO.  Al momento de simplemente dar click en el boton salir y si el foco se encuentra en el textbox de la cédula y no tengo registrado ningun valor BOOM me envia el mensaje que la cedula se encentra vacia lineas (19 y 20).  Pues TXTCEDULA.leave se ha generado. Lo que no es corrento el usuario tomo la decision de salir no importa que no halla escrito nada en la cédula.  Hay alguna manera de manejar dos eventos ??   textbox.leave y button.click????.  Solamente quiero que si el usuario decide salirse se omita cualquier otro evento...  T_T


    Agradezco cualquier ayuda


    azzillianknight

    jueves, 12 de julio de 2012 7:08

Respuestas

  • Hola:

    ¿Llamas a la comprobación/validación desde algún otro lado/evento?

    En el ejemplo que te puse, si estas en el TextBox1, y le das al boton 'Validar NO', no se ejecuta el evento Validating. Así que debería funcionar. Para comprobarlo, quita el PintaBoton.Activo (o los eventos MouseEnter/Leave) para comprobar si están afectando al tema de Validating.

    Si quieres saber el tema de eventos y su orden de ejecución:

    http://msdn.microsoft.com/es-es/library/86faxx0d(v=vs.85).aspx

    Saludos

    lunes, 16 de julio de 2012 7:01

Todas las respuestas

  • Hola:

    La 'teoría' dice que deberías usar el evento txtCedula.VALIDATE en vez de txtCedula.LEAVE, y en el botón Salir poner la propiedad .CausesValidation = False.

    El evento Validate se ejecuta cuando es necesario 'validar' el contenido del control (en teoría es mejor que el .leave).

    La propiedad .CausesValidation = False de botón indica que cuando pulses este botón, no se ejecutara el evento VALIDATE del control activo.

    Espero que te sirva.

    Saludos

    jueves, 12 de julio de 2012 7:50
  • Hola focus media gracias por tu aporte.  Pero no dio solucion he usado el evento validated y  cambiado  causese validation a false y no ha funcionado.

    Me sigue apareciendo el error de que no se ha registrado información en el campo cédula. Agradezco cualquier ayuda.

    PD

    Tendra algo que ver que tenga programado el evento mouseenter en el boton salir para cambiar la imagen y se vea resaltado


    azzillianknight

    jueves, 12 de julio de 2012 23:10
  • Hola:

    Al escribir puse Validated cuando es Validating, para probarlo, crea un formulario llamado frmCausesValidation con 2 textbox y 2 botones y copia este código:

    Public Class frmCausesValidation
        Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
            If MsgBox("¿Es Correcto?", MsgBoxStyle.OkCancel) = MsgBoxResult.Cancel Then
                e.Cancel = True
            End If
        End Sub
        Private Sub frmCausesValidation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Button1.CausesValidation = True
            Button1.Text = "Validar SI"
            Button2.CausesValidation = False
            Button2.Text = "Validar NO"
            TextBox1.Text = "Este TextBox se valida al salir"
            TextBox2.Text = "Este TextBox No se valida al salir"
        End Sub
    End Class

    Y así ves como funciona el evento Validating junto con CausesValidation.

    Lo del si el evento MouseEnter y el cambio de imagen afecta, no creo, pero puedes probarlo.

    Saludos

    viernes, 13 de julio de 2012 8:34
  • FocusMedia nada.  No se que pasa cambio la propiedad causes validation del boton y el evento validating y nada.  Al darle click al botonsalir, manteniendo el foco en el txtcedula y sin haber escrito nada.   Sale el error de que no he ingresado número de cédula.  Es decir entra a el evento validating.  T_T.  No se que hacer

    azzillianknight

    sábado, 14 de julio de 2012 3:15
  • Hola:

    Al escribir puse Validated cuando es Validating, para probarlo, crea un formulario llamado frmCausesValidation con 2 textbox y 2 botones y copia este código:

    Public Class frmCausesValidation
        Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
            If MsgBox("¿Es Correcto?", MsgBoxStyle.OkCancel) = MsgBoxResult.Cancel Then
                e.Cancel = True
            End If
        End Sub
        Private Sub frmCausesValidation_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Button1.CausesValidation = True
            Button1.Text = "Validar SI"
            Button2.CausesValidation = False
            Button2.Text = "Validar NO"
            TextBox1.Text = "Este TextBox se valida al salir"
            TextBox2.Text = "Este TextBox No se valida al salir"
        End Sub
    End Class

    Y así ves como funciona el evento Validating junto con CausesValidation.

    Lo del si el evento MouseEnter y el cambio de imagen afecta, no creo, pero puedes probarlo.

    Saludos


    He hecho lo que me sugeriste y nada T_T.

    El problema esta en que debo validar el txtcedula si no digitan datos o si digiitan letras no puedo colocarlo como causes validation false.

    No debo validarlo cuando el usuario decide salir del formulario. Es decir No valide cuando se produzca el evento (btnsalir.click)


    azzillianknight

    sábado, 14 de julio de 2012 15:31
  • Di solución, usando un boolean como variable y establecerla como true si el mouse entraba en el boton salir y false si el mouse salia.

    Private Sub BTNSALIR_MouseEnter(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTNSALIR.MouseEnter
            PintaBoton.Activo(BTNSALIR, My.Resources.NuevoUsuarioSalir_1)
            ValidaBtn.salir = True
        End Sub
     Private Sub BTNSALIR_MouseLeave(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTNSALIR.MouseLeave
            PintaBoton.NoActivo(BTNSALIR, My.Resources.NuevoUsuarioSalir_0)
            ValidaBtn.salir = False
        End Sub

    Ahora en el evento validating

    Public Sub TXTCEDULA_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TXTCEDULA.Validating
            If (Not ValidaBtn.salir) Then
                ValidaBtn.ErrorCedula(arreglo, BTNGUARDAR, My.Resources.NuevoUsuarioGuardar_0, My.Resources.NuevoUsuarioGuardarDeshabili_0, LBLVALIDACEDULA, TXTCEDULA)
            End If
        End Sub

     Pero me quedo la duda de como manejar eventos y que prioridad tienen.  de todas maneras gracias focus media


    azzillianknight

    • Marcado como respuesta azzillianknight sábado, 14 de julio de 2012 18:00
    • Desmarcado como respuesta azzillianknight sábado, 14 de julio de 2012 21:38
    sábado, 14 de julio de 2012 18:00
  • UY que mal, pues si el usuario entra al boton salir y pulsa tabulador FAIL no realiza la validacion en el campo cédula T_T.  Si alguien tiene una sugerencia le agrececería

    azzillianknight

    sábado, 14 de julio de 2012 21:40
  • Hola:

    ¿Llamas a la comprobación/validación desde algún otro lado/evento?

    En el ejemplo que te puse, si estas en el TextBox1, y le das al boton 'Validar NO', no se ejecuta el evento Validating. Así que debería funcionar. Para comprobarlo, quita el PintaBoton.Activo (o los eventos MouseEnter/Leave) para comprobar si están afectando al tema de Validating.

    Si quieres saber el tema de eventos y su orden de ejecución:

    http://msdn.microsoft.com/es-es/library/86faxx0d(v=vs.85).aspx

    Saludos

    lunes, 16 de julio de 2012 7:01
  • Hola:

    ¿Llamas a la comprobación/validación desde algún otro lado/evento?

    En el ejemplo que te puse, si estas en el TextBox1, y le das al boton 'Validar NO', no se ejecuta el evento Validating. Así que debería funcionar. Para comprobarlo, quita el PintaBoton.Activo (o los eventos MouseEnter/Leave) para comprobar si están afectando al tema de Validating.

    Si quieres saber el tema de eventos y su orden de ejecución:

    http://msdn.microsoft.com/es-es/library/86faxx0d(v=vs.85).aspx

    Saludos

    Gracias focus media, sabiendo el orden en el que se ejecutan los eventos al pasar el foco de un componente a otro sea

    a) x teclado o b) x mouse.  Es sencillo Gracias logre validar el campo cédula cuando se pulsa el boton salir en el evento enter del boton y en el evento enter de los demas componentes.  Asi logre controlar que valide siempre que se transfiera el foco o cuando se digite una tecla no admitida.  Todo esto ((((Excepto)))) cuando el usuario decida salirce.  Muchas gracias focus media   ;  )


    azzillianknight

    martes, 17 de julio de 2012 3:17