如何删除事件处理程序?

时间:2020-06-06 09:21:34

标签: vb.net

我无法删除活动 ,我只会临时调用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

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

1 个答案:

答案 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事件的处理程序。但这就是您重组代码来做到这一点的方式。

相关问题