locked
Anular eventos al cerrar formularios RRS feed

  • Pregunta

  • Saludos a Todos.

     

    Tengo un formulario con varios textbox, cuando cierro la aplicación grabo el contenido de cada textbox en mi Base de datos, y cierro el formulario.

    El problema es que despues de cerrar el formulario se me ejecuta el evento lostfocus det texbox en el que estaba, dando error al intentar leer mi BD cuando ya la habia cerrado con anterioridad.

    ¿Como puedo evitar que se produzca este evento?

     

    lunes, 24 de octubre de 2011 9:45

Respuestas

  • Buenas DavinciNieto.

    No sé muy bien la funcionalidad que tienes implementada en el evento LostFocus y ahora mismo no caigo si se ejecuta el evento FormClosing antes, pero si es así, puedes definir una variable global digamos:

    Dim vSalidaControlada As Boolean = False

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
         vSalidaControlada = True
    End Sub
    

    En el evento LostFocus añadir lo siguiente para cancelar el evento:

    If vSalidaControlada Then
         e.Cancel = True
    End If
    

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    lunes, 24 de octubre de 2011 10:12
  • "DavinciNieto" escribió:

    > En el evento lostFocus solo hago validacion y lectura de BD, no la grabacion.
    > El problema esta en que cuando grabo y cierro el formulario, si el foco esta
    > en un textbox ejecuta primero el evento "click" del boton grabar (que tambien
    > cierra) y despues el lostfocus del textbox.

    Hola:

    Yo te aconsejaría que en lugar de utilizar el evento LostFocus utilizases el evento Leave, por los motivos que se indica en la ayuda del método LostFocus

    Para que no se ejecute el código existente en el evento LostFocus o Leave cuando hayas hecho clic en el control Button que cierra el formulario, tienes que detectar el control actualmente activo. Para ello, al comienzo del evento LostFocus o Leave tendrías que ejecutar lo siguiente:

        Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
     
            ' Obtenemos el control actualmente activo.
            '
            Dim ctrl As Control = Me.ActiveControl
     
            If (ctrl.Name = "Button1") Then
                ' Si el control activo es el control Button1,
                ' el que cierra el formulario, abandonamos
                ' el procedimiento.
                '
                Return
            End If
     
           ' Ejecutar aquí el código propio del evento Leave.
           '
           ' ....
     
        End Sub
    

    Creo que los comentarios lo dicen todo. :-)

    Un saludo

     


    NOTA: si esta respuesta te ha resultado útil, recuerda marcarla como satisfactoria.

    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 24 de octubre de 2011 15:55
    Moderador

Todas las respuestas

  • Buenas DavinciNieto.

    No sé muy bien la funcionalidad que tienes implementada en el evento LostFocus y ahora mismo no caigo si se ejecuta el evento FormClosing antes, pero si es así, puedes definir una variable global digamos:

    Dim vSalidaControlada As Boolean = False

    Private Sub Form1_FormClosing(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
         vSalidaControlada = True
    End Sub
    

    En el evento LostFocus añadir lo siguiente para cancelar el evento:

    If vSalidaControlada Then
         e.Cancel = True
    End If
    

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    lunes, 24 de octubre de 2011 10:12
  • En el evento Lost_Focus del textbox no me recoge  e.cancel. Por lo que usare la variable vSalidaControlada para realizar o no las instrucciones del evento.

     

    Gracias.

    lunes, 24 de octubre de 2011 11:06
  • Correcto DavinciNieto.

    Un saludo.


    Antonio López Atienza
    Microsoft Community Contributor
    .NET Developer
    Code examples
    http://www.lopezatienza.es
    lunes, 24 de octubre de 2011 11:30
  • dando error al intentar leer mi BD cuando ya la habia cerrado con anterioridad.

    pero en que evento estas grabando los registros ? en el lostfocus

    porque no es un buen evento para realziar acceso a la base de datos, deberias grabar en el FormClosing directamente, peor no deberias ahcer nada en el LostFocus, salvo quizas alguna validacion

     

    slaudos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 24 de octubre de 2011 12:19
  • En el evento lostFocus solo hago validacion y lectura de BD, no la grabacion. El problema esta en que cuando grabo y cierro el formulario, si el foco esta en un textbox ejecuta primero el evento "click" del boton grabar (que tambien cierra) y despues el lostfocus del textbox.
    lunes, 24 de octubre de 2011 14:02
  • claro el tema es que si estas validando deberias usar el evento Validating, no el LostFocus

    pense que hacias otras cosas en el lostfocus, no solo validar, algo como ser

    Private Sub txtDireccion_Validating(..)
    
        If String.IsNullOrEmpty(txtDireccion.Text.Trim()) Then
            ErroProvider1.SetError(txtDireccion, "El campo DIRECCION es obligatorio.")
            e.Cancel = True
    	Else
    		ErroProvider1.SetError(txtDireccion, "")
        End If
    
    End Sub

    con el validating no tendrias ese problema porque no podrias sacar el foco si es invalido lo ingresado en el textbox, y se eejcuta en otro orden primero la validacion y luego el evento click del boton

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    lunes, 24 de octubre de 2011 14:20
  • "DavinciNieto" escribió:

    > En el evento lostFocus solo hago validacion y lectura de BD, no la grabacion.
    > El problema esta en que cuando grabo y cierro el formulario, si el foco esta
    > en un textbox ejecuta primero el evento "click" del boton grabar (que tambien
    > cierra) y despues el lostfocus del textbox.

    Hola:

    Yo te aconsejaría que en lugar de utilizar el evento LostFocus utilizases el evento Leave, por los motivos que se indica en la ayuda del método LostFocus

    Para que no se ejecute el código existente en el evento LostFocus o Leave cuando hayas hecho clic en el control Button que cierra el formulario, tienes que detectar el control actualmente activo. Para ello, al comienzo del evento LostFocus o Leave tendrías que ejecutar lo siguiente:

        Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
     
            ' Obtenemos el control actualmente activo.
            '
            Dim ctrl As Control = Me.ActiveControl
     
            If (ctrl.Name = "Button1") Then
                ' Si el control activo es el control Button1,
                ' el que cierra el formulario, abandonamos
                ' el procedimiento.
                '
                Return
            End If
     
           ' Ejecutar aquí el código propio del evento Leave.
           '
           ' ....
     
        End Sub
    

    Creo que los comentarios lo dicen todo. :-)

    Un saludo

     


    NOTA: si esta respuesta te ha resultado útil, recuerda marcarla como satisfactoria.

    Enrique Martínez
      [MS MVP - VB]

    Si usas Visual Basic .NET y deseas ser productivo y feliz, activa la instrucción Option Strict.

    lunes, 24 de octubre de 2011 15:55
    Moderador