vb.net多个过程handles一个事件
我也不知道这样规范不规范--,但是编译可以通过,例如有一个Button1,代码这样写:PrivateSubButton1_Click1(ByValsenderAsSyst...
我也不知道这样规范不规范 - -,但是编译可以通过,例如有一个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。点击按钮,三个过程都能触发,有没有人知道触发顺序是怎样的?我猜测是根据过程名称先后触发,不知道可不可靠…… 展开
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。点击按钮,三个过程都能触发,有没有人知道触发顺序是怎样的?我猜测是根据过程名称先后触发,不知道可不可靠…… 展开
2个回答
2013-07-09
展开全部
这个执行顺序由.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并没有对他们有过任何的明文说明
现在我测试了下,如果动态添加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并没有对他们有过任何的明文说明
2013-07-09
展开全部
应该是按照声明的先后顺序触发的你可以把EventArgs设置为handled来试试看不过你这种做法本身没有什么意义
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询