我在删除事件时遇到困难 ,我只临时调用上下文菜单(分配事件,事件完成后我不再使用它(,依此类推。
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
事件的处理程序。但这就是您重构代码以执行此操作的方式。