处理Me.FormClosing的两种方法;为什么他们按照这个特定的顺序开火?

时间:2011-08-11 06:27:20

标签: .net vb.net winforms

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) _
      Handles Me.Load, Me.FormClosing
        MessageBox.Show("form_load")
End Sub


Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As FormClosingEventArgs) _
    Handles Me.FormClosing
    MessageBox.Show("form_closing")
End Sub

在关闭表单时,我发现首先触发Form1_FormClosing方法,然后Form1_Load秒。

为什么选择此订单?为什么Form1_Load先被解雇/输入,然后Form1_FormClosing秒?

.NET如何选择首先触发哪个方法,哪个方法处理同一个事件?

1 个答案:

答案 0 :(得分:2)

两种方法都有Handles Me.FormClosing,因此在关闭表单时会执行这两种方法。他们没有特别执行。

当多个方法处理同一事件时,事件会按照要求接收事件的顺序调用它们。编译器已经任意决定Form1_FormClosing方法首先出现。尝试在两种方法之间添加此代码,看看它是否再次发生变化。

Private Sub Aaa(ByVal sender As Object, ByVal e As FormClosingEventArgs)
    Handles Me.FormClosing
    MsgBox("Aaa")
End Sub

在旁注中,我很惊讶您的代码编译,因为Form.LoadForm.FormClosing具有不同的签名。


如果您希望代码按特定顺序执行,只需处理一次事件并按顺序调用其他方法。

Private Sub Form1_Load(sender As Object, e As EventArgs)
    Handles Me.Load
    ReportLoad()
End Sub

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs)
    Handles Me.FormClosing
    ReportLoad()
    MsgBox("Form1_FormClosing")
End Sub

Private Sub ReportLoad()
    MsgBox("ReportLoad")
End Sub

使用不同名称的方法处理事件会产生误导和混淆。我永远不会猜到Form1_Load事件会调用FormClosing。如果要在一个方法中处理多个事件或多个对象的同一事件,请更改方法名称,如Form1_xxxxxxButton_Click,以便明确表示正在处理多个事件。