web-dev-qa-db-fra.com

Comment ajouter la fonctionnalité Dispose à un UserControl C #?

J'ai une classe qui implémente UserControl. Dans .NET 2005, une méthode Dispose est automatiquement créée dans le fichier de classe partielle MyClass.Designer.cs qui se présente comme suit:

  protected override void Dispose(bool disposing)
  {
     if (disposing && (components != null))
     {
        components.Dispose();
     }
     base.Dispose(disposing);
  }

Si je veux ajouter ma propre fonctionnalité Dispose, où la placerais-je? Puisque ce fichier est généré, je ne veux pas ajouter de code ici et risquer de s’envoler.

58
e-holder

Dans un tel cas, je déplace la méthode Dispose générée vers le fichier principal et l’étend. Visual Studio respecte cela.

Une autre approche consisterait à utiliser une méthode partielle (C # 3.0).

52
Michael Damatov

Toutes les classes Component implémentent un événement Disposed. Vous pouvez ajouter un gestionnaire d'événements pour cet événement et nettoyer les éléments qu'il contient.

Par exemple, dans votre UserControl, vous pouvez ajouter la méthode suivante:

private void OnDispose(object sender, EventArgs e)
{
    // do stuff on dispose
}

Et dans le constructeur (ou dans le gestionnaire d'événements Load), ajoutez la ligne suivante:

Disposed += OnDispose;
67
Jacob Seleznev

Je crois que dans ce cas, le générateur de code respecte votre code. Il devrait être prudent de le mettre dans le code ci-dessous.

7
Micah

Dans VS 2005 (et 2008), vous pouvez mettre à jour la méthode Dispose. Elle ne sera pas supprimée lorsque vous modifierez le contrôle à partir du concepteur.

6
akmad

Il vous suffit de surcharger la méthode publique Void Dispose () dans la classe de composant dont le contrôle utilisateur a hérité.

assurez-vous de passer l'appel à la méthode de base et de disposer de votre fonction de manière fonctionnelle, sinon vous casserez la fonctionnalité si vous ne la mettez pas complètement en œuvre

2
user94261

Vous pouvez le déplacer du fichier .designer.cs vers le fichier .cs principal si vous le souhaitez. Comme cela a déjà été dit, il ne sera pas écrasé.

2
Mark Heath

Je pense que le moyen le plus propre serait de demander à votre contrôle de s'abonner à son propre événement Disposed () et de le nettoyer.

0
dynamichael