gpt4 book ai didi

.net - 如何检查 Sub 是否正在处理非自定义事件?

转载 作者:行者123 更新时间:2023-12-04 04:54:09 24 4
gpt4 key购买 nike

对于自定义事件,我可以像这样检查处理程序:

 If Object.EventNameEvent Is Nothing Then
MsgBox("Is not handling it.")
End If

...但是我如何做同样的事情,例如,检查设计器中生成的按钮的“.click”事件?这不起作用:
If Button1.ClickEvent Is Nothing Then
MsgBox("Is not handling it.")
End If

UPDATE



我的要求示例:
    MsgBox(HasAttachedHandler(MySub, Button1.Click))  ' Expected result: True
MsgBox(HasAttachedHandler(MyFunc, Button1.Click)) ' Expected result: False

Private Sub MySub() Handles Button1.Click, Button2.Click
' bla bla bla
End Sub

Private Function MyFunc() Handles Button2.Click
' bla bla bla
End Function

UPDATE 2:



我正在尝试使用@ 瓦罗卡巴斯解决方案,但并没有完全满足我的需求,因此我尝试进行必要的修改以使其正常工作。问题是事件“FontChaged”没有返回想要的结果,你可以在这里看到:
    Public Class Form1

Private WithEvents Button1 As New Button

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
' This is working (Result True):
MsgBox(HasAttachedHandler(Button1, "Click", "Button1_Click")) ' Result: True

' This is not working (Result False):
MsgBox(HasAttachedHandler(Button1, "FontChanged", "Button1_Click")) ' Expected result: True
End Sub

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles _
Button1.Click, _
Button1.MouseHover, _
Button1.GotFocus, _
Button1.Enter, _
Button1.FontChanged, _
Button1.AutoSizeChanged

End Sub

Private Function HasAttachedHandler(ByVal ctl As Control, ByVal eventname As String, ByVal targetMethod As String) As Boolean

For Each evnt In ctl.GetType().GetEvents()

' Get secret key for the current event:
Dim curEvent As Reflection.FieldInfo = GetType(Control).GetField("Event" & evnt.Name, Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)

If (curEvent IsNot Nothing) Then
Dim secret As Object = curEvent.GetValue(Nothing)

' Retrieve the current event:
Dim eventsProp As Reflection.PropertyInfo = GetType(System.ComponentModel.Component).GetProperty("Events", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim events As System.ComponentModel.EventHandlerList = DirectCast(eventsProp.GetValue(ctl, Nothing), System.ComponentModel.EventHandlerList)

If (Not IsNothing(events(secret))) AndAlso curEvent.Name.ToLower = "event" & eventname.ToLower Then
Dim handler As [Delegate] = events(secret)
Dim method As Reflection.MethodInfo = handler.Method
If (targetMethod = method.Name) Then Return True
End If
End If
Next

Return False
End Function

End Class

最佳答案

这是我对@HansPassant 发布的代码进行转换和修改的尝试:

Imports System.Reflection
Imports System.ComponentModel
Public Class Form1

Private WithEvents btnA As New Button
Private WithEvents btnB As New Button

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
btnA.AutoSize = True
btnA.Text = "Handler Attached"
btnA.Location = New Point(10, 10)
Me.Controls.Add(btnA)

btnB.AutoSize = True
btnB.Text = "No Handlers Attached"
Dim pt As Point = btnA.Location
pt.Offset(btnA.Width, 0)
btnB.Location = pt
Me.Controls.Add(btnB)
End Sub

Private Sub btnA_Click(sender As Object, e As System.EventArgs) Handles btnA.Click
Dim btnA_Handled As Boolean = HasAttachedHandler("Click", btnA)
Dim btnB_Handled As Boolean = HasAttachedHandler("Click", btnB)

Debug.Print("btnA_Handled = " & btnA_Handled)
Debug.Print("btnB_Handled = " & btnB_Handled)
End Sub

Private Function HasAttachedHandler(ByVal EventName As String, ByVal ctl As Control) As Boolean
' Get secret click event key
Dim eventClick As FieldInfo = GetType(Control).GetField("Event" & EventName, BindingFlags.NonPublic Or BindingFlags.Static)
Dim secret As Object = eventClick.GetValue(Nothing)
' Retrieve the click event
Dim eventsProp As PropertyInfo = GetType(Component).GetProperty("Events", BindingFlags.NonPublic Or BindingFlags.Instance)
Dim events As EventHandlerList = DirectCast(eventsProp.GetValue(ctl, Nothing), EventHandlerList)
Return Not IsNothing(events(secret))
End Function

End Class

关于.net - 如何检查 Sub 是否正在处理非自定义事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012515/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com