Problema con evento LostFocus VS 2010

Publicado en 'Programación' por Raise, 17 Feb 2015.





  1. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1




    Buenas noches, recurro a la sabiduría de este foro para resolver un problema al cual no le encuentro sentido alguno porque en primer lugar no debería ocurrir.

    Lo que quiero hacer es sencillo, tengo un formulario conectado a una base de datos, escribo el código de un empleado en un textbox y cuando hago tab o clickeo en otro lado debe activarse el LostFocus y mostrarme el Nombre en un label al costado del textbox si es que el código existe en la BD, si no aparece un MsgBox indicando que el código no existe; en parte me funciona... Funciona el doble la primera vez que lo hago cuando escribo a propósito un código que no existe, es decir, el textbox está en blanco y al presionar una letra aparece el mensaje, termino de escribir el código de empleado y pulso tab y vuelve a aparecer el mensaje (esto sí debería pasar), lo que no quiero que pase es lo resaltado, vamos, que es un evento lostfocus, no un keypress, no debería saltar nada.

    Dejo el código para su revisión.

    Código:
    Private Sub txtEMP_LostFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles txtEMP.LostFocus
            If String.IsNullOrEmpty(txtEMP.Text) Then
                Return
            End If
    
            Dim cmd As SqlCommand
            Dim dr As SqlDataReader
    
            cmd = New SqlCommand("SELECT * FROM EMPLEADOS WHERE CODEMP='" & Trim(txtEMP.Text) & "'", cn)
            dr = cmd.ExecuteReader()
    
            If dr.Read() Then
                If String.Equals(Trim(txtEMP.Text), CStr(dr("CODEMP"))) Then
                    lblemp.Text = CStr(dr("NOMEMP"))
                    dr.Close()
                End If
            ElseIf Not dr.Read() Then
                MsgBox("Empleado no existe", MsgBoxStyle.Information, "Hey!")
                lblump.Text = ""
                txtEMP.Focus()
                dr.Close()
                Return
            End If
    
            dr.Close()
        End Sub
    Gracias de antemano.
     


  2. AiApaec

    AiApaec Miembro frecuente

    Registro:
    1 May 2014
    Mensajes:
    58
    Likes:
    14
    Siempre es bueno mirar la documentación y ésta dice que no se debería usar el evento LostFocus sino Leave.

    Fuente: https://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus(v=vs.110).aspx
     
  3. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    No me digas, olvidé mencionar que ya había probado con Leave y que obtengo el mismo resultado.
     
  4. AiApaec

    AiApaec Miembro frecuente

    Registro:
    1 May 2014
    Mensajes:
    58
    Likes:
    14
    Si te digo, con leave debería funcionar sin problemas. Tal vez se deba a la versión de .net...por las mismas rrazones que explican en el link.. en .net 4 los textnox ya no traen ese evento, solo leave.
    ....
     
  5. Raise

    Raise Miembro nuevo

    Registro:
    13 May 2014
    Mensajes:
    21
    Likes:
    1
    Agrego que se dispara dos veces también con validated y validating.
     
  6. AiApaec

    AiApaec Miembro frecuente

    Registro:
    1 May 2014
    Mensajes:
    58
    Likes:
    14
    El mismo código no me da error, ni con Leave ni con LostFocus
    PHP:
    Private Sub txt1_Leave(sender As System.ObjectAs System.EventArgsHandles txt1.LostFocus
            
    If (Not "ai".Equals(txt1.Text.Trim().ToLower())) Then
                MessageBox
    .Show("incorrecto")
                
    txt1.Focus()
            Else
                
    MessageBox.Show(txt1.Text)
            
    End If
        
    End Sub
     
Etiquetas: