Button.Click event doesn't fire after TextBox.Leave event

£可爱£侵袭症+ 提交于 2019-12-12 03:51:58

问题


I use the below code to verify if the text into a TextBox was changed and ask for saving changes:

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

But when I click a button (for example button1) while the cursor is inside TextBox1, only TextBox1.Leave event was raised.

How can I have Button?.click event raise after TextBox1.Leave event?


回答1:


How can I have button1.click event raise after TextBox1.Leave event?

If TextBox1 has the focus and you click a button the leave event will fire before the click event. To test click in Texbox1, then click 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

Try to clarify your question please.

edit: This recreates the problem I think you are having,

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

Did some searching and found that the Message box causes pending focus events to be lost.




回答2:


Thanks to dbasnett's hints I was able to get the name of the control that fired the Leave event, so to call it (if it's a button) after the Message Box was showed:

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

Anyway Plutonix showed me a better solution here




回答3:


You can call multiple events one after the another. Your TextBox1_Leave event could trigger Button1_click event.

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

Hope this helps.



来源:https://stackoverflow.com/questions/38524738/button-click-event-doesnt-fire-after-textbox-leave-event

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!