visual net vb.net event-handling

vb.net - visual - vb net database access



El evento Button.Click no se activa después del evento TextBox.Leave (3)

Utilizo el siguiente código para verificar si el texto en un TextBox fue cambiado y solicito guardar los cambios:

Private TBoxTxtBefore As String = String.Empty Private Sub TextBox1_Enter(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Enter Try TBoxTxtBefore = CType(sender, TextBox).Text Catch ex As Exception MsgBox(ex.ToString) End Try End Sub Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave Try If CType(sender, TextBox).Text <> TBoxTxtBefore Then Dim SN As MsgBoxResult = MsgBox("Save changes?", vbYesNo, "Save Changes") If SN = vbYes Then Btn_SaveChanges.PerformClick() End If Catch ex As Exception MsgBox(ex.ToString) End Try End Sub

Pero cuando hago clic en un botón (por ejemplo, button1 ) mientras el cursor está dentro de TextBox1 , solo TextBox1.Leave evento TextBox1.Leave .

¿Cómo puedo hacer que Button?.click event raise después de TextBox1.Leave event?


¿Cómo puedo hacer que button1.click event raise después de TextBox1.Leave event?

Si TextBox1 tiene el foco y haces clic en un botón, el evento de permiso se activará antes del evento click. Para probar haga clic en Texbox1, luego haga clic en Button1.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Debug.WriteLine("B1C") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Debug.WriteLine("B2C") End Sub Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave Debug.WriteLine("TBL") Button2.PerformClick() End Sub

Intenta aclarar tu pregunta por favor.

editar: Esto recrea el problema que creo que tienes

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Debug.WriteLine("B1C") End Sub Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click Debug.WriteLine("B2C") End Sub Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave MessageBox.Show("FOO") Debug.WriteLine("TBL") Button2.PerformClick() End Sub

Realizó algunas búsquedas y descubrió que el cuadro Mensaje causa la pérdida de eventos de foco pendientes.


Gracias a los consejos de dbasnett, pude obtener el nombre del control que activó el evento Leave, por lo tanto, para llamarlo (si es un botón) después de que se mostró el cuadro de mensaje:

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave Try Dim FiringCtrl As Control = Me.Activecontrol If CType(sender, TextBox).Text <> TBoxTxtBefore _ AndAlso FiringCtrl.Name <> "Btn_SaveChanges" Then Dim SN As MsgBoxResult = MsgBox("Save changes?", vbYesNo, "Save Changes") If SN = vbYes Then Btn_SaveChanges.PerformClick() If TypeOf FiringCtrl Is Button Then DirectCast(FiringCtrl, Button).PerformClick() End If End If Catch ex As Exception MsgBox(ex.ToString) End Try End Sub

De todos modos Plutonix me mostró una mejor solución aquí


Puede llamar eventos múltiples uno después del otro. Su evento TextBox1_Leave podría desencadenar el evento Button1_click.

Private Sub TextBox1_Leave(ByVal sender As Object, ByVal e As System.EventArgs) Handles TextBox1.Leave ''Take the control to another sub. Pass the sender control and the event details as arguments Call Button1_Click(sender,e) End Sub Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click ''Do your stuff here End Sub

Espero que esto ayude.