我怎么知道.net事件是否已被处理?

时间:2010-08-13 13:36:18

标签: .net vb.net events event-handling

我已经编写了一些代码来处理事件,如下所示:

AddHandler myObject.myEvent, AddressOf myFunction

似乎一切都在起作用,但是当我运行调试器时,我发现myFunction每次myObject.myEvent发生时都会运行几次。我发现我已经允许代码添加事件处理程序多次运行,导致这种行为。

我有办法做这样的事吗?

If myObject.myEvent is not handled Then
  AddHandler myObject.myEvent, AddressOf myFunction
End If

8 个答案:

答案 0 :(得分:13)

假设您的代码不是发布活动的,那么您不能。这个想法是订阅者彼此隔离 - 你无法找到其他活动订阅者,自己提出活动等。

如果问题是多次添加自己的处理程序,您应该能够通过跟踪是否添加了处理程序来自行修复。 Steven在添加处理程序之前删除处理程序的想法是一个有趣的解决方法:尝试删除处理程序即使它没有订阅也是有效的。但是,我认为这是一个解决方案,你的应用程序不知道它应该做什么。这是一个非常快速的短期解决方案,但我担心长期保留它。

答案 1 :(得分:7)

或者:

  1. 不要添加您的处理程序 一次。

  2. 尝试仅删除处理程序 在添加之前。

答案 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

来自此处的答案:Determine if an event has been attached to yet

答案 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