簡體   English   中英

我如何知道 .net 事件是否已被處理?

[英]How can I know if a .net event is already handled?

我編寫了一些代碼來處理事件,如下所示:

AddHandler myObject.myEvent, AddressOf myFunction

一開始似乎一切正常,但是當我運行調試器時,我發現很多時候myFunction會在每次myObject.myEvent觸發時運行幾次。 我發現我允許代碼添加事件處理程序多次運行,從而導致這種行為。

有沒有辦法我可以做這樣的事情?

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

假設發布事件的不是你的代碼,你不能。 這個想法是訂閱者彼此隔離 - 您無法了解其他事件訂閱者,自己引發事件等。

如果問題是多次添加自己的處理程序,您應該能夠通過跟蹤是否添加了處理程序來自行解決該問題。 Steven 在添加之前刪除處理程序的想法是一個有趣的解決方法:即使在未訂閱的情況下嘗試刪除處理程序也是有效的。 但是,我認為這是您的應用程序不知道它應該做什么的一種解決方法。 這是一個非常快速的短期解決方案,但我擔心將其保留更長時間。

任何一個:

  1. 不要多次添加處理程序。

  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

來自此處的答案: 確定是否已附加事件

無法判斷處理程序是否已附加,但您可以在調用 AddHandler 之前安全地對事件調用 RemoveHandler。 如果還沒有處理程序,RemoveHandler 將不起作用。

刪除處理程序,然后添加它。 這樣它就永遠不會被復制。 如果您的對象不存在,請注意空引用錯誤。 我也發現了這一點,當您在創建處理程序的子程序之外刪除處理程序時可能會發生這種情況。

if not myObject is nothing then RemoveHandler myObject.myEvent, AddressOf myFunction
if not myObject is nothing then AddHandler myObject.myEvent, AddressOf myFunction

將您的事件處理程序結果保存到數據庫/會話中,然后再次讀取它們以檢查事件是否已被處理。

我知道我玩這個游戲晚了幾年,但你總是可以定義一個類變量的范圍,然后在事后設置它。 這不是一種完全固化的做事方式,但它比只是希望您沒有某些東西或每次都重新添加它要好。 在我的情況下,我在 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

您可以使用IsHandleCreated屬性來檢查您的事件是否已經有一個句柄。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM