web-dev-qa-db-fra.com

Quel événement signale qu'un UserControl est en train d'être détruit?

J'ai un contrôle dérivé de UserControl qui affiche des informations extraites d'un serveur Web. Je suis actuellement en train de rendre l'initialisation du contrôle asyncrone, afin d'améliorer la réactivité.

Dans mon gestionnaire d'événements Load, je crée un CancellationTokenSource et j'utilise le jeton associé dans les différents appels asynchrones.

Je veux maintenant m'assurer que si l'utilisateur ferme le formulaire avant la fin de l'opération asynchrone, l'opération sera annulée. En d'autres termes, je veux appeler Annuler sur le jeton.

J'essaie de comprendrefaire ceci. S'il y avait un événement de déchargement que je pourrais intercepter, ce serait parfait - mais il n'y en a pas. En fait, je ne trouve aucun événement qui semble approprié.

Je pourrais intercepter l'événement de fermeture pour le formulaire conteneur, mais je souhaitais vraiment tout conserver dans mon contrôle utilisateur.

Suggestions?

35
Gary McGill

Je suggère le Control :: HandleDestroyed event. Il est déclenché lorsque le HWnd sous-jacent est détruit (ce qui se produit généralement lorsque le formulaire parent est fermé). Pour le gérer dans votre propre UserControl, vous devez remplacer OnHandleDestroyed .

Vous avez un accès complet aux propriétés du contrôle en ce moment, car il n’est pas encore éliminé.

36
Stephan

Une autre solution

    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);

        if (parentForm != null)
        {
            parentForm.Closing -= parentForm_Closing;
        }
        parentForm = FindForm();

        if (parentForm != null)
            parentForm.Closing += parentForm_Closing;
    }

    void parentForm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        parentForm.Closing -= parentForm_Closing;
        parentForm = null;
        //closing code
    }
11
Avram

Pourquoi ne pas simplement utiliser l'événement Disposed ?

Lorsqu'un formulaire se ferme, il appelle Dispose sur lui-même et tous les contrôles enfants sont également supprimés de manière récursive.

1
sloth

Essaye ça:

UserControl.Dispose();
0
Gimhan