【发布时间】:2010-11-10 09:01:03
【问题描述】:
我需要将事件作为参数传递给函数。有没有办法做到这一点?
原因是我的程序中有两行代码序列,我在其中动态删除事件处理程序,然后再次设置处理程序。我正在为几个不同的事件和事件处理程序执行此操作,因此我决定编写一个执行此操作的函数。
例如,假设我的代码中有一个名为 combobox1 的组合框,并且我有一个名为 indexChangedHandler 的处理程序。在我的代码的几个地方,我有以下两行:
RemoveHandler combobox1.SelectedIndexChanged, AddressOf indexChangedHandler
AddHandler combobox1.SelectedIndexChanged, AddressOf indexChangedHandler
现在,我不想在整个程序中重复上述两行代码(或类似代码),所以我正在寻找一种方法来做到这一点:
Private Sub setHandler(evt As Event, hndler As eventhandler)
RemoveHandler evt, hndler
AddHandler evt, hndler
End Sub
所以在我的程序中出现这两行代码(或类似代码)的任何地方,我都可以将它们替换为:
setHandler(combobox1.SelectedIndexChanged, AddressOf indexChangedHandler)
到目前为止,setHandler 函数的参数的“evt as Event”部分给出了错误。
P.S:我已经在其他几个论坛上问过这个问题,并且一直有人问我为什么要在删除处理程序后立即设置它。原因是因为动态添加事件处理程序 n 次会导致处理程序在事件发生时执行 n 次。为了避免这种情况,也就是保证事件发生时handler只执行一次,我每次想动态添加handler时都先去掉handler。
您可能会问为什么首先要多次添加处理程序...原因是因为我仅在表单中发生特定事件(例如 E1)之后添加处理程序(我在其中添加处理程序事件 E1) 的处理程序。并且事件 E1 可以在我的表单中发生多次。如果我在再次添加之前每次都没有删除处理程序,则处理程序会被添加并因此执行多次。
无论如何,此时函数内发生的处理对我来说并不是最重要的,而只是将事件作为参数传递的方法。
【问题讨论】:
-
你能告诉我们错误是什么吗?
-
没有真正的方法可以以编程方式执行此操作,因为您无法将引用传递给事件成员。我也不确定 setHandler 应该做什么......你能解释一下为什么你需要删除一个事件处理程序,然后再重新添加它吗?
-
@cdhowie 我正在编辑我的帖子以解释为什么我需要这样做,被打断了,回来完成编辑并提交,然后才意识到你已经问过这个问题了.长话短说,原因现在包含在原帖中:)
-
我明白了。不幸的是,真的没有办法做你在这里问的......
标签: vb.net events parameters