2009-09-01 8 views
6

Où vous désinscrire des événements dans un UserControl? Je m'y suis inscrit dans l'événement Load, comme je l'ai fait dans les formulaires. Et dans les formulaires, je me désabonnais généralement dans l'événement Closing, mais je ne trouve rien de similaire dans le UserControl ...Où se désinscrire des événements dans un WinForms UserControl

Répondre

2

Est-il nécessaire de se désabonner du tout? Une référence au contrôle utilisateur est-elle conservée après son déchargement? Si ce n'est pas le cas, vous n'avez pas à vous soucier des gestionnaires d'événements, car dès que le contrôle utilisateur est supprimé de la mémoire, les gestionnaires d'événements le sont également. Vous ne fuyez pas les références de cette façon.

+0

Donc, si UserControl écoute quelque chose, et UserControl est hors de portée, le gestionnaire d'événements disparaît et le UserControl sera recueilli comme il se doit. Si quelque chose sort de la portée, il ne sera pas collecté tant que UserControl ne se sera pas désabonné ou n'aura pas été hors de portée. Ai-je bien compris? – Svish

+2

@Svish: Non. Si UserControl écoute Quelque chose et que UserControl est hors de portée, UserControl ne sera pas ** collecté, car quelque chose contient toujours une référence à UserControl. I Quelque chose est hors de portée et UserControl ne contient aucune référence. Quelque chose sera collecté. – dtb

+0

Donc, en d'autres termes, si quelque chose va exister après la mort de UserControl, je vais devoir vous désabonner pour le UserControl à collecter? – Svish

1

Comme d'autres l'ont dit, est-il vraiment nécessaire de vous désabonner dans votre scénario?

Si vous avez vraiment besoin de résilier votre abonnement mais vous le faire exactement l'inverse de la souscription:

UserControl1.Click -= new EventHandler(UserControl1_Click); 
+0

Mais où le ferais-je? – Svish

4

Il sont moments où vous voulez faire (par exemple, lors de l'utilisation CAB).
Pour être complet, la réponse à votre question est:

protected override void OnCreateControl() 
{ 
    base.OnCreateControl(); 
    if(!DesignMode) //only time this.ParentForm should be null 
     this.ParentForm.FormClosing += ParentForm_FormClosing; 
} 

private void ParentForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    //Unregister events here 
} 

Vous pouvez également remplacer Dispose()

+0

Le problème que ce contrôle ne fait référence ni au parent ni au parent. –

Questions connexes