Обработчик событий не удаляется сам? - PullRequest
0 голосов
/ 05 июля 2010

В начале функции VB .NET я удаляю обработчик событий и снова добавляю его в конец функции, потому что код функции будет вызывать эти события, и я не хочу, чтобы они срабатывали в течение всей функции.Обычно это работает, но я столкнулся с несколькими ситуациями, когда событие все еще вызывается, даже если я уже удалил его.Иногда удаление его дважды в начале функции исправляет это, но в других случаях, независимо от того, сколько раз я его удаляю, оно все равно срабатывает.Любые идеи о том, что может быть причиной этого?

Изменить

Код находится в форме, которая имеет представление данных в виртуальном режиме.Я хочу запустить некоторые операции, которые вызовут событие CellValueNeeded для datagridview без запуска этого события (потому что это будет мешать).

Public Sub DoEventRaisingStuff()
    RemoveHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded

    'Do things that would trigger CellValueNeeded

    AddHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded
End Sub

Многократное удаление обработчика не препятствует запуску события, поэтомукажется, что он не был добавлен несколько раз случайно где-то еще.

Есть ли способ узнать, какие обработчики событий активны?

Ответы [ 2 ]

1 голос
/ 06 июля 2010

Если вызывается код обработки события, то происходит одно из двух:

  1. Вы не удаляете обработчик событий.

  2. Вы добавляете обработчик событий несколько раз. Это более обычный случай.

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

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

0 голосов
/ 06 июля 2010

Используйте флаг области видимости класса в функции и проверьте флаг в обработчике событий.

т.е:.


Private RunFunction as Boolean = False

...

Private Sub MyEvent(e as system.eventargs) handles myObject.Method
   If RunFunction Then
      ...
   End If
End Sub

...

Private Sub MyFunction()
   RunFunction = False

   ...

   RunFunction = True
End Sub
...