2010-07-05 23 views
0

Au début d'une fonction VB .NET, je supprime un gestionnaire d'événements et l'ajoute à la fin de la fonction car le code de la fonction déclencherait ces événements et je ne veux pas qu'ils se déclenchent pendant la durée de la fonction. Cela fonctionne généralement, mais j'ai rencontré quelques situations où l'événement est toujours appelé même si je l'ai déjà supprimé. Parfois, le supprimer deux fois au début de la fonction le fixe, mais d'autres fois, peu importe combien de fois je l'enlève, il se déclenche toujours. Des idées sur ce qui pourrait causer cela?Le gestionnaire d'événements ne se retire pas?

Modifier

Le code est dans un formulaire qui a un datagridview en mode virtuel. Je veux exécuter certaines opérations qui déclencheront l'événement CellValueNeeded pour le datagridview sans que cet événement soit déclenché (parce qu'il interférera).

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

    'Do things that would trigger CellValueNeeded 

    AddHandler grid.CellValueNeeded, AddressOf grid_CellValueNeeded 
End Sub 

Suppression du gestionnaire à plusieurs reprises n'empêche pas l'événement de tir, il ne semble pas être ajouté plusieurs fois par un autre accident.

Existe-t-il un moyen de savoir quels gestionnaires d'événements sont actifs?

+0

Si vous postez le code, il devrait être plus facile de vous aider. –

+0

C'est vrai, mais je ne sais pas vraiment quoi publier car je ne sais pas où est le problème et le programme est assez grand. Je me demandais plus simplement si quelqu'un d'autre a déjà rencontré ce problème et qu'est-ce qui l'a résolu pour eux. – davidscolgan

+0

Vous pouvez au moins afficher le code correspondant à la fonction spécifique dont vous parlez. –

Répondre

1

Si le code de gestion des événements est appelé alors l'une des deux choses se passe:

  1. Vous ne supprimez pas le gestionnaire d'événements.

  2. Vous ajoutez le gestionnaire d'événements plusieurs fois. C'est le cas le plus courant.

Dans le passé, la seule façon que je suis en mesure de repérer 2. est de trouver tous les endroits où le gestionnaire d'événements est ajouté (je l'espère seulement un ou deux) et mettre des points de rupture sur ces lignes. J'ai alors couru l'application sous le débogueur et ai constaté qu'il casse plus de temps que je m'attends. J'utilise la pile d'appels pour comprendre pourquoi - c'est toujours moi qui place le code d'ajout au mauvais endroit (sur une pression sur un bouton plutôt que sur une instanciation de formulaire par exemple).

Vous pouvez faire de même avec le code de suppression. Comptez le nombre de fois où chaque point de rupture est atteint et s'ils ne sont pas les mêmes, sauvegardez la pile d'appels pour voir si vous pouvez déterminer pourquoi.

0

Utilisez l'indicateur de portée de classe dans la fonction et vérifiez l'indicateur dans le gestionnaire d'événements.

i.e. .:


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