2009-09-30 4 views
0

J'ai mon propre contrôle personnalisé dérivé de System.Windows.Forms.TreeView qui est présent sur la boîte à outils de concepteur.C# .NET - Puis-je changer la classe à laquelle le concepteur ajoute des événements?

J'ajoute une instance de ce contrôle personnalisé à mon formulaire (en utilisant le concepteur).

Le but que j'ai créé un contrôle hérité est que je veux laisser le contrôle lui-même gérer ses événements puisqu'il est censé agir comme Voir dans une conception MVC standard. C'est à dire. lorsque la sélection du nœud dans l'arborescence change je veux que la vue gère toutes les interactions avec le Modèle.

Le problème est que lorsque j'ajoute un événement pour mon contrôle personnalisé (en utilisant le concepteur), l'événement est ajouté à ma classe MainForm. La seule option dans ce cas est de transférer chaque événement dans mon contrôle personnalisé, ce qui ne me semble pas très optimal.

Existe-t-il un moyen de contrôler la classe à laquelle l'événement est ajouté? Je sais que c'est techniquement possible puisque je peux éditer le code généré automatiquement pour mon MainForm et faire que l'événement soit déclenché dans le contrôle personnalisé. Ce n'est clairement pas la bonne solution.

Merci.

Répondre

1

Tom Frey est juste. Si vous voulez que le comportement sur un certain événement soit géré par la classe qui déclencherait normalement l'événement, la technique préférée consiste à remplacer la méthode appropriée qui déclenche l'événement pour exécuter votre tâche. L'infrastructure événementielle est exagérée et pas vraiment conçue pour ce que vous essayez de faire ici.

La raison est que vous souhaitez que chaque instance de votre vue effectue ces actions. Vous ne voulez pas que ces actions soient attribuées dynamiquement et déterminées à l'exécution par des éléments externes à votre vue (ce qui est la raison d'être des événements). Un élément important à inclure lorsque vous effectuez une telle substitution est cependant l'appel à l'implémentation de la base. Si vous ne le faites pas, vous pouvez rencontrer des erreurs étranges:

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) 
{ 
    // Do stuff you want done before here 
    base.OnNodeMouseClick(e); 
    // Do stuff you want done after here 
} 

L'appel de la classe de base se déclenche l'événement et peut effectuer d'autres actions encore. Si vous voulez que quelque chose soit fait avant que l'événement se déclenche et que les abonnés externes fassent leur chose, mettez-le avant l'appel à la base. Si vous voulez que quelque chose soit fait après que tous les événements aient été déclenchés et traités, mettez-le après. Exemple contraint: si votre contrôle a manipulé une liaison de données, vous pouvez vérifier que la liaison de données existe avant l'appel à la base et vous pouvez vouloir vérifier qu'elle est valide après (dans le cas où un gestionnaire a modifié quelque chose).

De MSDN:

La méthode OnNodeMouseClick aussi permet classes dérivées à gérer l'événement sans y attacher un délégué. C'est la technique préférée pour gérer l'événement dans une classe dérivée .

Notes: Héritiers

Lors de la substitution OnNodeMouseClick dans une classe dérivée, veillez à appeler OnNodeMouseClick de la classe de base méthode afin que les délégués inscrits reçoivent l'événement.

+0

Merci! Pourriez-vous, s'il vous plaît, clarifier le type de tâches qui pourraient être effectuées avant et après l'appel de la classe de base? – sharkin

+0

L'appel de la classe de base déclenche l'événement et peut effectuer d'autres actions. Si vous voulez que quelque chose soit fait avant que l'événement se déclenche et que les abonnés externes fassent leur chose, mettez-le avant l'appel à la base. Si vous voulez que quelque chose soit fait après que tous les événements aient été déclenchés et traités, mettez-le après. Exemple contraint: si votre contrôle a manipulé une liaison de données, vous pouvez vérifier que la liaison de données existe avant l'appel à la base et vous pouvez vouloir vérifier qu'elle est valide après (dans le cas où un gestionnaire a modifié quelque chose). –

2

pourquoi ne pas vous venez de remplacer certaines des méthodes dans votre classe dérivée, .: par exemple

protected override void OnNodeMouseClick(TreeNodeMouseClickEventArgs e) 
    { 
    } 
+0

Cela semble être une bonne façon de le faire, merci. Je suppose que je vais définir cela comme la réponse s'il s'avère impossible d'utiliser le concepteur. – sharkin

+0

Ne pas oublier la base. OnNodeMouseClick (e) – recursive

+0

@recursive: Comme par magie il est apparu par courtoisie de intellisense :). – sharkin

Questions connexes