如何使用VB.Net从表单事件中删除所有处理程序? [英] how to remove all handler from an event of form using VB.Net?
问题描述
我正在开发一个窗口应用程序(使用Vb编写。在主窗体Load事件中,还加载了另一种形式'frmcrew_managment'。在此阶段,对于主窗体的RefreshClick事件,
附加'frmcrew_managment'的'Refreshadata'方法(处理程序)。因此,在加载主窗体后,它的RefreshClick事件具有'frmcrew_managment'方法的地址。现在在主窗体中,菜单选项之一是OpenAdjustment(frmOpenAdjustment
)。所以onclick的OpenAdjustment选项,在它的表单加载(对于frmOpenAdjustment)我需要将RefreshGriddata方法(frmOpenAdjustment)附加到Main Form的RefreshClick事件,当用户点击主屏幕上的Refresh时,刷新frGOpenAdjustment
的方法被调用。但是现在发生的事情正在发生的frmcrew_managment的Refreshadata也被调用了。因此,为了解决这个问题,我需要在添加frmOpenAdjustment的事件处理程序RefreshGriddata之前从主Form的RefreshClick事件中删除所有事件处理程序。那么
是从主窗体的事件(RefreshClick)中删除所有事件处理程序的方法吗?
我尝试了什么:
Private _parent As frmMainAlt
Private _Me as frmOpenAdjustmentsAlt
Private _crewMgt As frmCrewManagement
_ parent = parent
RemoveHandler _parent.RefreshClick,AddressOf _crewMgt.RefreshData
AddHandler _parent.RefreshClick,AddressOf refreshgrid
这里的要求是默认情况下在所有情况下主要
表单的Refreshclick应该由frmcrew_managment的Refreshadata处理,但是当从菜单选项加载frmOpenAdjustment时,主表单的Refreshclick应该由frmOpenAdjustment的RefreshGriddata处理
推荐答案
基本的经验法则是跟踪处理程序,订阅,完成后,取消订阅。
The base rule of thumb is to keep track of handlers, subscribe, when done, unsubscribe.
我可能错了,但是这里有人(可能是里德)可能写过这个。
I may be wrong but someone here (possibly Reed) may have written this.
Public Class Form1
Dim object1 As New Button
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
AddHandler object1.Click, AddressOf Object1_Click
End Sub
Private Sub Object1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'NB: EventName is case sensitive
If HandlerContains(object1, "Object1_Click", "Click") Then
MsgBox("Found Handler")
End If
End Sub
Private Function HandlerContains(ByVal Obj As Control, ByVal TheMethod As String, ByVal EventName As String) As Boolean
Dim T = Obj.GetType.GetProperty("Events", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim Key = GetType(Control).GetField("Event" & EventName, Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static).GetValue(Obj)
Dim EventHandlerList = T.GetValue(Obj, New Object() {})
Dim MethodFind = EventHandlerList.GetType.GetMethod("Find", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim ListEntry = MethodFind.Invoke(EventHandlerList, New Object() {Key})
Dim Del = ListEntry.GetType.GetField("handler", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim MultiCastDelegate = Del.GetValue(ListEntry)
Dim MethodGIL = MultiCastDelegate.GetType.GetMethod("GetInvocationList")
Dim EvocationList() As [Delegate] = CType(MethodGIL.Invoke(MultiCastDelegate, Nothing), [Delegate]())
For Each Target As [Delegate] In EvocationList
If Target.Method.Name = TheMethod Then
Return True
End If
Next
Return False
End Function
End Class
这篇关于如何使用VB.Net从表单事件中删除所有处理程序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!