我无法删除活动 ,我只会临时调用contextmenu(分配事件,并且在事件结束后我将不再使用它),依此类推。
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
在这种情况下是否需要删除它们?以及如何做到这一点? 谢谢!
答案 0 :(得分:1)
Sub() f_Cm_Closed(f_Cm)
是lambda expression。 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
事件的处理程序。但这就是您重组代码来做到这一点的方式。