当前位置: 代码迷 >> VB Dotnet >> 两个步骤引发同一个事件时的机制
  详细解决方案

两个步骤引发同一个事件时的机制

热度:147   发布时间:2016-04-25 02:19:05.0
两个方法引发同一个事件时的机制
如下面两个方法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语句
  相关解决方案