Hériter des gestionnaires d'événements en C #
Je suis en quelque sorte renoncé à moi-même dans un coin ici.
J'ai une série de contrôles utilisateur que d'hériter d'un parent, qui contient un couple de méthodes et événements pour simplifier les choses, donc je n'ai pas à écrire des lignes et des lignes de quasi-identiques code. Comme vous le faites. Le parent ne contient pas d'autres contrôles.
Ce que je veux faire est juste un gestionnaire d'événements, dans le parent de l'objet UserControl, qui va et ne des trucs que seul le contrôle parent peut faire (et qui est, sous certaines conditions de l'appel d'un événement, que l'événement est défini dans le parent). Alors je dirais crochet jusqu'à ce gestionnaire d'événement à tous mes boîtes de saisie de mon enfant contrôles, et l'enfant contrôles de tri de la tâche de l'analyse de l'entrée et de dire le contrôle parent que de jeter de l'événement. Agréable et propre, pas répétitif, copier-coller le code (qui pour moi toujours résultats dans un rapport de bogue).
Voici ma question. Visual Studio pense que je suis trop malins, et me prévient que "la méthode 'CheckReadiness' [le gestionnaire d'événement dans le parent] ne peut pas être la méthode pour un événement parce qu'une classe de cette classe dérive de déjà définit la méthode." Oui, Visual Studio, c'est le point. Je voulez d'avoir un gestionnaire d'événement qui ne s'occupe que des événements lancés par les classes enfant, et son travail est de me permettre de raccorder les enfants sans avoir à écrire une seule ligne de code. Je n'ai pas besoin de ces suppléments de gestionnaires - toutes les fonctionnalités dont j'ai besoin est naturellement appelé à mesure que les enfants du processus de la saisie de l'utilisateur.
Je ne suis pas sûr pourquoi Visual Studio a commencé à se plaindre à ce sujet maintenant (comme il permettez-moi de le faire avant), et je ne suis pas sûr de la façon de la faire disparaître. De préférence, j'aimerais le faire sans avoir à définir une méthode qui appelle simplement CheckReadiness. Quelle est la cause de cet avertissement, quelle en est la cause à venir jusqu'à maintenant, quand il n'a pas une heure, et comment puis-je la faire disparaître, sans avoir recours à peu de gestionnaires dans toutes les classes enfant?
source d'informationauteur Merus
Vous devez vous connecter pour publier un commentaire.
Déclarer la méthode parent virtuel, de le remplacer dans les classes enfant et de l'appel
(ou derevation de celui-ci) à partir de l'intérieur de la classe enfant. Cela permet pour la conception future de l'évolution de dire si vous voulez faire un peu d'erreur spécifique de code de vérification avant l'appel de la mère de gestionnaire d'événements. Vous ne pourriez pas besoin d'écrire des millions de gestionnaires d'événements de ce genre pour chaque commande, vous pouvez simplement écrire un crochet, tous les contrôles de ce gestionnaire d'événement qui appelle à son tour la mère du gestionnaire d'événement.
Seule chose que j'ai noté, c'est que si tout ce code est placé dans une dll, vous risquez de rencontrer un gain de performance d'essayer d'appeler un gestionnaire d'événements au sein d'une dll.
Je viens de tomber sur ce, je suis d'accord qu'il se sent comme vous êtes en train de faire tout correctement. Déclarer la méthode virtuelle est une façon de contourner au mieux, pas une solution.
Ce qui est fait est valide - un contrôle qui n'existe que dans la classe dérivée, et la classe dérivée est de la fixation d'un gestionnaire d'événement pour l'un de que du contrôle des événements. Le fait que la méthode qui est la manipulation de l'événement est défini dans la classe de base n'est ni ici ni là-bas, il est disponible au point de liaison à l'événement. L'événement n'est pas attaché à deux ou quelque chose de stupide comme ça, c'est simplement une question de l'endroit où la méthode qui gère l'événement est défini.
Plus certainement, il n'est pas une méthode virtuelle - je ne veux pas la méthode pour être remplacée par une classe dérivée. Très frustrant, et à mon avis, un bug dans dev-studio.
Moi aussi j'ai connu ce problème parce que dans les versions antérieures de VS, vous pourriez "hériter" les gestionnaires d'événements. Donc la solution que j'ai trouvé sans avoir à remplacer les méthodes consiste simplement à attribuer le gestionnaire d'événement quelque part dans la phase d'initialisation de la forme. Dans mon cas, fait dans le constructeur (je suis sûr que OnLoad() serait de travailler en tant que bien):
...où le Ok_Click gestionnaire réside dans la forme de base. De la nourriture pour la pensée.
Je viens de lancer sur le problème exact Merus a d'abord soulevé et, comme d'autres qui ont posté des réponses, je ne suis pas clair du tout pourquoi VS (je suis maintenant à l'aide de Visual C# 2010 Express) les objets pour avoir le gestionnaire d'événement défini dans la classe de base. La raison pour laquelle je suis de poster une réponse, c'est que dans le processus de contourner le problème en faisant de la classe de base de code d'une méthode protégée que les classes dérivées suffit de l'appeler dans leur (essentiellement vide) des gestionnaires d'événements, j'ai fait un peu de remaniement renommer de la méthode de classe de base et a remarqué que le VS designer cessé de se plaindre. Qui est, elle a rebaptisé le gestionnaire d'événement d'enregistrement (de sorte qu'il n'est plus suivi le VS designer convention de nommage des gestionnaires d'événements avec ControlName_EventName), et qui semblait la satisfaire. Alors quand j'ai essayé d'enregistrer le (désormais) de la base de gestionnaire d'événement à l'encontre de la classe dérivée de contrôles en entrant le nom de la approprié VS événement, le designer qui a créé un nouveau gestionnaire d'événement dans la classe dérivée qui j'ai ensuite supprimé, laissant la classe dérivée de contrôle enregistré à la classe de base (gestionnaire d'événement) de la méthode. Net, que vous attendez, C# trouve ce que nous voulons faire de pièce de théâtre. C'est seulement le VS designer qui ne l'aime pas quand vous la suite de la concepteur du gestionnaire d'événements convention de nommage. Je ne vois pas la nécessité pour le concepteur de travailler de cette façon. Anywho, le temps de le réaliser.
Si votre événement est déjà défini dans votre classe parent, vous n'avez pas besoin de refaire l'installation de nouveau dans votre classe enfant. Qui sera la cause de l'événement à feu à deux reprises.
Faire vérifier si c'est ce qui se passe. HTH 🙂
Cet article sur MSDN devrait être un bon point de départ: Primordial des Gestionnaires d'Événements avec Visual Basic .NET. Jetez un oeil à la Comment la Clause de Poignées Peuvent Causer des Problèmes dans la Classe Dérivée section.
Pourquoi ne pas déclarer la méthode virtuelle dans la classe parent et ensuite vous pouvez l'annuler dans les classes dérivées pour ajouter des fonctionnalités supplémentaires?
Oublier que c'est l'un gestionnaire d'événement et il suffit de faire la bonne méthode régulière remplacer dans la classe enfant.
Voici ce que j'ai fait pour passer de la base de méthodes appelées dans plusieurs formes, chacun d'eux ayant quelques fonctionnalités supplémentaires à la commune:
La chance de l'omission d'utiliser le bon bouton fixe nom semble le même pour moi, comme la possibilité de ne pas le câblage de l'héritage gestionnaire manuellement.
Noter que vous pouvez avoir besoin de le tester.DesignMode de sorte que vous ignorez le code de VS Designer à tous, mais il fonctionne très bien pour moi, même sans la vérifier.