代码之家  ›  专栏  ›  技术社区  ›  Vivian River

如何知道.net事件是否已处理?

  •  10
  • Vivian River  · 技术社区  · 15 年前

    AddHandler myObject.myEvent, AddressOf myFunction
    

    一开始似乎一切正常,但当我运行调试器时,我发现, myFunction myObject.myEvent 解雇。我发现我允许代码多次添加事件处理程序,从而导致了这种行为。

    If myObject.myEvent is not handled Then
      AddHandler myObject.myEvent, AddressOf myFunction
    End If
    
    8 回复  |  直到 15 年前
        1
  •  14
  •   Jon Skeet    15 年前

    假设发布事件的不是您的代码,您就不能这样做。其思想是订阅者彼此隔离—您无法找到其他事件订阅者,也无法自己引发事件等。

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

        2
  •  8
  •   Steven Sudit    15 年前

    或者:

    1. 添加处理程序的次数不要超过

    2. 尝试仅删除处理程序

        3
  •  4
  •   Josh    15 年前

    无法判断处理程序是否已附加,但可以在调用AddHandler之前安全地对事件调用RemoveHandler。如果还没有处理程序,RemoveHandler将不起作用。

        4
  •  4
  •   Community CDub    8 年前

    VB.Net版在模式中创建一个特殊的私有成员变量 <YourEvent>Event 你可以用它来测试。

    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

        5
  •  1
  •   user1500403    7 年前

    删除处理程序,然后添加它。这样它就永远不会被复制。如果对象不存在,请注意空引用错误。我也发现了这一点,当您在创建处理程序的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
  •   Kon    15 年前

    将事件处理程序结果保存到数据库/会话中,然后再次读取它们以检查事件是否已被处理。

        7
  •  0
  •   djangojazz    8 年前

    我知道我在游戏中迟到了几年,但是你总是可以定义一个类变量,然后在事后设置它。这并不是一种完全僵硬的做事方式,但总比希望自己没有什么东西或每次都重新添加好。在我的例子中,我在一个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
    
        8
  •  -3
  •   Saqib    11 年前

    你可以用 IsHandleCreated

      If e.Control.IsHandleCreated = False Then
                AddHandler e.Control.KeyPress, AddressOf TextBox_keyPress
      End If