我已经编写了一些代码来处理事件,如下所示:
AddHandler myObject.myEvent, AddressOf myFunction
似乎一切都在起作用,但是当我运行调试器时,我发现myFunction
每次myObject.myEvent
发生时都会运行几次。我发现我已经允许代码添加事件处理程序多次运行,导致这种行为。
我有办法做这样的事吗?
If myObject.myEvent is not handled Then
AddHandler myObject.myEvent, AddressOf myFunction
End If
答案 0 :(得分:13)
假设您的代码不是发布活动的,那么您不能。这个想法是订阅者彼此隔离 - 你无法找到其他活动订阅者,自己提出活动等。
如果问题是您多次添加自己的处理程序,您应该能够通过跟踪您是否添加了处理程序来自行修复。 Steven在添加处理程序之前删除处理程序的想法是一个有趣的解决方法:尝试删除处理程序即使它没有订阅也是有效的。但是,我认为这是一个解决方案,你的应用程序不知道它应该做什么。这是一个非常快速的短期解决方案,但我担心长期保留它。
答案 1 :(得分:7)
或者:
不要添加您的处理程序 一次。
尝试仅删除处理程序 在添加之前。
答案 2 :(得分:3)
没有办法告诉处理程序已经附加,但您可以在调用AddHandler之前安全地调用事件上的RemoveHandler。如果还没有处理程序,则RemoveHandler将不起作用。
答案 3 :(得分:2)
我知道这是一个老帖子,但只是想为那些朝这个方向前进的人添加一个解决方案......
VB.Net以<YourEvent>Event
模式创建一个特殊的私有成员变量,然后您可以使用它来测试Nothing。
Public Event MyClick As EventHandler
Private Sub OnMyClick()
If MyClickEvent IsNot Nothing Then
RaiseEvent MyClick(Me, New EventArgs())
Else
' No event handler has been set.
MsgBox("There is no event handler. That makes me sad.")
End If
End Sub
答案 4 :(得分:0)
将事件处理程序结果保存到数据库/会话中,然后再次读取它们以检查事件是否已被处理。
答案 5 :(得分:0)
删除处理程序,然后添加它。这样就永远不会重复。如果您的对象不存在,请注意空引用错误。我也被抓住了,当你在创建处理程序的sub之外删除处理程序时可能会发生这种情况。
if not myObject is nothing then RemoveHandler myObject.myEvent, AddressOf myFunction
if not myObject is nothing then AddHandler myObject.myEvent, AddressOf myFunction
答案 6 :(得分:0)
我知道我比游戏晚了几年,但你可以随时调整一个类变量,然后在事后设置它。这不是一种完全强化的做事方式,但它比仅仅希望你没有东西或每次都重新加入它更好。在我的情况下,我在WinForms应用程序中使用它,我想添加一个处理程序,用于拖放到datagridview表面。如果另一个datagridview的一部分还没有完全依赖它,我想停止这个功能。
所以它会是这样的:
班级
Private _handlersAdded As Boolean = False
构造
Public Sub New()
AddHandler dgv.DragEnter, AddressOf DragEnter
_handlersAdded = True
End Sub
确定问题的方法:
Private Sub CheckRowsAreDone()
For Each row As DataGridViewRow In dgv.Rows
Dim num = 0
For i = 0 To row.Cells.Count - 1
Dim val = If(Not String.IsNullOrEmpty(row?.Cells(i)?.Value?.ToString), 1, -1)
num += val
Next
If num > -(row.Cells.Count) And num < (row.Cells.Count) Then
RemoveHandler dgv.DragEnter, AddressOf DragEnter
_handlersAdded = False
Exit Sub
End If
If Not _handlersAdded Then
AddHandler dgv.DragEnter, AddressOf DragEnter
_handlersAdded = True
End If
Next
End Sub
答案 7 :(得分:-3)
您可以使用IsHandleCreated
属性来检查您的活动是否已处理。
If e.Control.IsHandleCreated = False Then
AddHandler e.Control.KeyPress, AddressOf TextBox_keyPress
End If