如何使用VB.Net从表单事件中删除所有处理程序? [英] how to remove all handler from an event of form using VB.Net?

查看:85
本文介绍了如何使用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆