2010-07-05 2 views
0

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

Редактировать

Код в форме, которая имеет виртуальный режим DataGridView. Я хочу запустить некоторые операции, которые вызовут событие 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 

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

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

+0

Если вы публикуете код, вам должно быть проще помочь вам. –

+0

Это правда, но я не знаю, что писать, так как я не знаю, где проблема, и программа довольно большая. Мне было просто интересно, если кто-то еще сталкивался с этой проблемой раньше и что исправил ее для них. – davidscolgan

+0

Вы могли бы хотя бы опубликовать код для конкретной функции, о которой вы говорите. –

ответ

1

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

  1. Вы не вынимая обработчик событий.

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

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

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

0

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

т.е .:


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