Как я могу узнать, обработано ли событие .net? - PullRequest
10 голосов
/ 13 августа 2010

Я написал некоторый код для обработки события следующим образом:

AddHandler myObject.myEvent, AddressOf myFunction

Сначала казалось, что все работает, но когда я запускал отладчик, я обнаруживал, что часто myFunction будетзапустить несколько раз каждый раз myObject.myEvent выстрелил.Я понял, что позволил коду добавить обработчик событий для запуска более одного раза, что привело к такому поведению.

Есть ли способ сделать что-то подобное?

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

Ответы [ 8 ]

13 голосов
/ 13 августа 2010

Если вы публикуете событие не в своем коде, вы не можете. Идея состоит в том, что подписчики изолированы друг от друга - вы не можете узнать о других подписчиках мероприятия, поднять событие самостоятельно и т. Д.

Если проблема в том, что вы добавляете свой собственный обработчик несколько раз, вы сможете исправить это самостоятельно, отслеживая, добавили ли вы обработчик. Идея Стивена об удалении обработчика перед его добавлением - интересный обходной путь: допустимо пытаться удалить обработчик, даже если он не подписан. Однако я бы расценил это как обходной путь для вашего приложения, не знающего, что оно должно делать. Это очень быстрое краткосрочное решение, но я бы побеспокоился о том, чтобы оставить его на более длительный срок.

7 голосов
/ 13 августа 2010

Или:

  1. Не добавляйте ваш обработчик больше, чем один раз.

  2. Попытка удалить обработчик просто до его добавления.

3 голосов
/ 13 августа 2010

Невозможно сказать, что обработчик уже подключен, но вы можете безопасно вызвать RemoveHandler для события перед вызовом AddHandler.Если обработчик еще не создан, RemoveHandler не будет иметь никакого эффекта.

2 голосов
/ 06 марта 2015

Я знаю, что это старый пост, но я просто хотел добавить решение для тех, кто смотрит в этом направлении ...

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

Ответ получен отсюда: Определите, было ли событие прикреплено к

0 голосов
/ 23 ноября 2016

Я знаю, что я на несколько лет опоздал с игрой, но вы всегда можете указать переменную класса, а затем установить ее по факту.Это не полностью закаленный способ делать вещи, но это лучше, чем просто надеяться, что у вас ничего нет, или заново добавлять его каждый раз.В моем случае я использовал это в приложении WinForms, где я хотел добавить обработчик для перетаскивания на поверхность сетки данных.Я хотел остановить эту функциональность, если часть другого представления данных еще не была заполнена полностью, от чего она зависела.

Так было бы так:

Уровень класса

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
0 голосов
/ 06 сентября 2015

Удалите обработчик и затем добавьте его.Таким образом, он никогда не будет дублирован.Остерегайтесь ошибки нулевой ссылки, если ваш объект не существует.Я тоже понял это, и это может произойти, когда вы удаляете обработчик вне подпрограммы, в которой он создан.

if not myObject is nothing then RemoveHandler myObject.myEvent, AddressOf myFunction
if not myObject is nothing then AddHandler myObject.myEvent, AddressOf myFunction
0 голосов
/ 08 августа 2014

Вы можете использовать свойство IsHandleCreated, чтобы проверить, что у вашего мероприятия уже есть дескриптор.

  If e.Control.IsHandleCreated = False Then
            AddHandler e.Control.KeyPress, AddressOf TextBox_keyPress
  End If
0 голосов
/ 13 августа 2010

Сохраните результаты вашего обработчика событий в базе данных / сеансе, а затем снова прочитайте их, чтобы проверить, было ли событие уже обработано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...