当前位置:编程学习 > VB >>

vb.net多个过程handles一个事件

我也不知道这样规范不规范 - -,但是编译可以通过,

例如有一个Button1,代码这样写:

Private Sub Button1_Click1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show("1")
End Sub

Private Sub Button1_Click2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show("2")
End Sub

Private Sub Button1_Click3(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MessageBox.Show("3")
End Sub

三个不同的过程,全部Handles 了 Button1.Click。点击按钮,三个过程都能触发,有没有人知道触发顺序是怎样的?

我猜测是根据过程名称先后触发,不知道可不可靠……

答案:这个执行顺序由.net内部处理和维护
现在我测试了下,如果动态添加delegate的话,那么事件调用就会按照添加的先后顺序来执行
不过在过程里直接用"handles 某个事件"来指定的话,顺序就不一定了,比如我测试你的代码就是3,1,2的循序,和处理过程的名字应该没什么关系
不过事件的处理过程会按照在invocation list里的循序来执行

给你一段代码

Function GetHandlers(ByVal instance As Object, ByVal e As String) As String
Dim pi As PropertyInfo = GetType(Button).GetProperty("Events", BindingFlags.Instance Or BindingFlags.NonPublic)
Dim ehl As EventHandlerList = CType(pi.GetValue(instance, Nothing), EventHandlerList)
Dim fi As FieldInfo = GetType(Control).GetField("Event" & e, BindingFlags.Static Or BindingFlags.NonPublic)
Dim d As [Delegate] = ehl(fi.GetValue(Nothing))
Dim handlerStr As String = Nothing
If (d <> Nothing) Then
For Each i As [Delegate] In d.GetInvocationList()
handlerStr = handlerStr & i.Method.Name & vbCrLf
Next
Else
handlerStr = "无"
End If
Return handlerStr
End Function

调用gethandlers函数可以得到某个控件的某个事件注册的所有handler,这个顺序就是真正的调用顺序了

但我觉得还是应该不要太过依赖这部分内容,不管是用handles还是addhandler,现在是这样,以后的版本说不定就变成其他了,因为ms并没有对他们有过任何的明文说明

应该是按照声明的先后顺序触发的

你可以把EventArgs设置为handled来试试看

不过你这种做法本身没有什么意义

上一个:VB.NET连接各种数据库的语句
下一个:How to inte易做图ce SAP to Mainframes using VB script

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,