2010-12-09 41 views
0

Ceci est un scratcheur de tête. J'ai un formulaire avec un certain nombre de contrôles personnalisés à ce sujet. La première fois que j'en crée une instance, tout fonctionne normalement.Pourquoi les contrôles C# ayant IsDisposed sont-ils mis à "Vrai" sans le déclenchement de la méthode "Dispose"

Le problème se produit lorsque je ferme le formulaire et puis créer une deuxième instance de celui-ci. Certains de mes contrôles ont un événement qui est (conditionnellement) levé au cours d'une souris. En OnMouseOver() immédiatement avant d'élever MyEvent tout est normal, mais au moment où j'entre la méthode MyControl_MyEventIsDisposed est mis à vrai sur le formulaire et tous ses contrôles enfants. Cela se produit malgré le fait que les points d'arrêt dans la méthode Dispose du formulaire et des contrôles ne sont jamais déclenchés.

Le cours des événements que j'ai décrits ci-dessus n'est pas unique; Je peux déclencher la même erreur dans quelques autres endroits, mais je n'ai pas percé la pile d'appels avec autant de détails en essayant de trouver exactement où IsDisposed est mis à vrai.

//MyConrol 
    protected override void OnMouseMove(MouseEventArgs e) 
    { 
     base.OnMouseMove(e); 

     if (conditions) 
     { 
      if (MyEvent != null) 
       MyEvent(this, new EventArgs()); //nothing disposed here 
     } 
    } 

    //the first of several classes that have sbuscribed to the event 
    void MyControl_MyEvent(object sender, EventArgs e) 
    { 
     //IsDisposed = true here if this is the second time the form has been displayed. 
     DoStuff(); 
    } 


    protected override void Dispose(bool disposing) 
    { //the breakpoint here is never triggered 
     if (disposing && (components != null)) 
     { 
      components.Dispose(); 
     } 
     base.Dispose(disposing); 
    } 

Quelqu'un peut-il suggérer comment je peux comprendre ce qui se passe?

+1

Pouvez-vous coller le code où vous détruisez et recréer le formulaire? – cdhowie

+0

Comme @cdhowie dit, pas assez d'infos. J'aimerais également voir un exemple de Dispose de ces contrôles personnalisés. Des membres statiques? –

+0

@Henk Holterman Voir mon commentaire sur la réponse de SLaks, mon EventHandler était statique. –

Répondre

4

Vous avez probablement oublié de vous désabonner des événements lorsque le formulaire est fermé. Par conséquent, lorsque la seconde forme est ouverte, chaque événement sera traité deux fois - une fois par la première forme (qui est disposée) et une fois par la seconde (qui ne l'est pas).

En tant qu'aide au débogage, vous pouvez cliquer avec le bouton droit sur this dans la fenêtre Locals et cliquer sur Make Object ID pour voir quelle instance vous regardez.

+0

Un nouvel objet de formulaire ne doit pas avoir de gestionnaires d'événements attachés provenant d'instances de formulaire précédentes ... – cdhowie

+0

@cdhowie: Mais l'ancien formulaire gère (probablement) encore les événements. Évidemment, cela dépend de ce que l'événement vient. – SLaks

+0

@SLaks: peu probable. Il semble que les événements soient liés dans le formulaire (les gestionnaires sont privés). Ce n'est pas une preuve, mais c'est un scénario de meilleure estimation car nous n'avons pas beaucoup de code à suivre. – cdhowie