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如何选择首先触发哪个方法,哪个方法处理同一个事件?
答案 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.Load
与Form.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_xxx
或xxxButton_Click
,以便明确表示正在处理多个事件。