如何删除处理程序事件?



我在删除事件时遇到困难 ,我只临时调用上下文菜单(分配事件,事件完成后我不再使用它(,依此类推。

sub register()
Dim f_Cm As Windows.Forms.ContextMenuStrip = New System.Windows.Forms.ContextMenuStrip(Me.components)
AddHandler f_Cm.Closed, Sub() f_Cm_Closed(f_Cm)
end sub
'mycode1
Private Sub f_Cm_Closed(f_Cm As Windows.Forms.ContextMenuStrip)
'....mycode
RemoveHandler f_Cm.Closed, Sub() f_Cm_Closed(f_Cm)
End Sub
'mycode2
Private Sub f_Cm_Closed(f_Cm As Windows.Forms.ContextMenuStrip)
'....mycode
Dim e1 As ToolStripDropDownClosedEventArgs = address of f_Cm_Closed(f_Cm)
RemoveHandler f_Cm.Closed, e1
End Sub

在这种情况下,我需要删除它们吗?以及如何做到这一点? 谢谢!

Sub() f_Cm_Closed(f_Cm)就是所谓的lambda表达式。lambda 表达式基本上是没有名称的方法;在某些情况下,它们是有用的快捷方式。您在代码Sub() f_Cm_Closed(f_Cm)中所做的是创建一个新的无名称方法,然后调用f_Cm_Closed(f_Cm)

这不是你想要的,你想要将引用直接传递给你的处理程序,以便以后可以删除它。为此,您可以使用AddressOf.

在执行此操作之前,方法签名必须匹配。所以

Private Sub f_Cm_Closed(f_Cm As Windows.Forms.ContextMenuStrip)

将不得不成为

Private Sub f_Cm_Closed(sender As Object, e As ToolStripDropDownClosedEventArgs)

sender将永远是f_Cm,所以你可以这样投射:

Dim f_Cm As Windows.Forms.ContextMenuStrip = sender

为了将所有内容整合在一起,您的AddHandler呼叫现在变为:

AddHandler f_Cm.Closed, AddressOf f_Cm_Closed

而你的方法f_Cm_Closed变成:

Private Sub f_Cm_Closed(sender As Object, e As ToolStripDropDownClosedEventArgs)
Dim f_Cm As Windows.Forms.ContextMenuStrip = sender
RemoveHandler f_Cm.Closed, AddressOf f_Cm_Closed
End Sub

作为最后一个想法,我不知道为什么要在菜单关闭后删除Closed事件的处理程序。但这就是您重构代码以执行此操作的方式。

最新更新