如下面两个方法OnFileSaveAs()和OnFileSave()都引发同一个事件SaveMenuItem.Click,它们的执行机制与先后顺序是怎样的啊?
Private Sub OnFileSaveAs(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles SaveMenuItem.Click
If filename = "未命名文档" Then
OnFileSaveAs(sender, e)
Else
SaveFile()
End If
End Sub
Private Sub OnFileSave(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles SaveMenuItem.Click
If SaveFileDlg.ShowDialog = DialogResult.OK Then
filename = SaveFileDlg.FileName
SaveFile()
End If
End Sub
Private Sub SaveFile()
Try
File.WriteAllText(filename, txtBoxEdit.Text)
Catch ex As Exception
MessageBox.Show(ex.Message, "文本编辑器", MessageBoxButtons.OK, _
MessageBoxIcon.Exclamation)
End Try
End Sub
------解决方案--------------------
事件是变了形的委托,而委托可以是多播
所以我并不想直接给你答案,你自己度娘一下“多播委托执行顺序”就明白了
ps:事件的注册过程你可以在Designer.vb这个文件里面找
------解决方案--------------------
首先明确一点,这不是引发事件,而是事件处理。两个方法通过Handles子句处理同一个由WithEvents修饰的成员的事件。
1.如果你想知道事件处理程序是如何通过Handles子句进行绑定的,建议你直接阅读Visual Basic语言规范(在你的Visual Studio安装目录\VB\Specifications 的一个子文件夹里)
2.关于执行顺序,规范没有规定绑定顺序,实现上由编译器自行选择绑定顺序,而执行顺序和绑定顺序相同,故执行顺序是编译器决定的。在实践中,不同事件处理程序中不应当有顺序依赖性。如果两个事件处理程序有明显的顺序依赖性,它们应当合并后再进行绑定。
3.VB.Net合并委托用System.Delegate.Combine,对应的,移除用System.Delegate.Remove。显示地为事件添加处理程序使用AddHandler语句,对应的,移除事件处理程序使用RemoveHandler语句