10
votes

Comment cloner des gestionnaires d'événements de contrôle au moment de l'exécution?

Je veux dupliquer une commande comme un bouton, une zone de texte, etc. Mais je ne sais pas comment je peux copier des méthodes de gestionnaire d'événements (comme cliquez sur code>) sur le nouveau contrôle.

J'ai le code suivant maintenant: p>

var btn2 = new Button();  
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click


2 commentaires

Je ne sais pas pourquoi vous voudriez dupliquer, mais un simple passé de copie créerait une nouvelle instance du contrôle.


Voulez-vous créer un double du bouton Disons-le au moment de l'exécution? Avec le même gestionnaire d'événements que le bouton précédent?


5 Réponses :


0
votes

Je ne vous ai pas compris que vous avez une question correctement. Vous pouvez joindre un événement à plusieurs contrôles comme celui-ci.

Button1.Click += button_click;
Button2.Click += button_click;


4 commentaires

Oui, je suppose que je ne connais pas la fonction "Button_Click", j'ai juste une touche1 et je veux obtenir les fonctions liées à l'événement.


Ensuite, je pense que vous devez appeler la méthode Bouton.PerformClick (). Il exécutera l'événement de clic associé.


Oui c'est bon, mais je ne peux pas l'utiliser directement, btn2.click + = nouvel événementHandler (BTN1.PerformClick); ERREUR >> Aucune surcharge pour 'PerformClick' Matchs Matchs 'System.Event.Event.Event'


Je peux aussi utiliser ce code, btn2.click + = (SS, EE) => {btn1.performclick ();};



6
votes

Vous avez juste besoin de Ajouter le gestionnaire d'événements Méthode pour le nouveau Contrôle des boutons. C # utilise l'opérateur + = code> pour le faire. Donc, vous pourriez simplement écrire:

btn2.Click += btn1_Click


2 commentaires

Mais je veux un contrôle dupliqué et je ne connais pas la fonction "btn1_click"


@MRBM: Comme je l'ai mentionné dans le commentaire à la réponse de VIMVQ1987, si vous ne connaissez pas le nom de la méthode du gestionnaire d'événements au moment de l'exécution, vous devrez utiliser la réflexion. C'est un peu plus compliqué, mais beaucoup plus puissant. Les liens que j'ai fournis ont un code d'échantillon complet.



-5
votes

La meilleure approche utilise une classe de composants et hériter de la commande à cette classe xxx

Vous pouvez modifier la classe partielle afin qu'il n'y ait pas besoin de créer des événements < / p>


4 commentaires

Je ne le pense pas. L'événement est attaché à une instance du bouton, pas la classe elle-même. L'héritage ne fonctionne tout simplement pas, dans ce cas


Je veux dupliquer un contrôle pas une classe!


Qu'est-ce que cela a à voir avec la question?


L'événement est attaché à une instance, pas à la classe!



16
votes

cloner tous les événements de tout contrôle WinForms:

var eventsField = typeof(Component).GetField("events", BindingFlags.NonPublic | BindingFlags.Instance);
var eventHandlerList = eventsField.GetValue(button1);
eventsField.SetValue(button2, eventHandlerList);


4 commentaires

HRM, peut-être. Mais est-ce documenté quelque part? Les "événements" sont-ils garantis comme le nom de ce domaine pour toute l'éternité? Aussi, ressemble à la solution ici .


@Cody - Cela fonctionne dans .NET 2, 3.5 et 4. Cela fonctionnera-t-il plus tard - personne ne le sait. Est-ce un piratage? Oui c'est le cas.


Juste un mot de prudence à quiconque veut faire cela. Le champ d'événements dans la classe des composants est une EventHandlerlist. Ce que vous faites ici consiste à copier la référence uniquement (un pointeur à son emplacement en mémoire), de sorte que les deux composants partagent désormais la même liste. Chaque fois que vous modifiez la liste des gestionnaires d'événements pour tout événement dans l'une ou l'autre des composants (celui que vous avez copié ou celui que vous avez copié à), vous modifiez la liste des personnes d'événements des deux. Sois conscient de cela et assurez-vous que c'est ce que vous voulez faire et cela ne vous causera aucun problème. Je ferais attention à appeler ce "clonage". C'est plus comme "Partager".


J'ai essayé d'utiliser ceci pour recréer automatiquement un Sub-itemstripmenuitem comme contextMenu Sous-éléments pour servir de menu de clic droit, mais en utilisant ceci pour copier les auditeurs de < Code> ToolstripMenuitem Les objets dans le nouveau Menuitem n'avaient aucun effet.



1
votes

Si vous cherchez simplement à dupliquer l'élément HTML qui finira par rendu (y compris les gestionnaires d'événements ci-dessous), vous pouvez utiliser la méthode d'extension ci-dessous pour émettre une copie du HTML.

<% btn1.Text = "Text for original button"; %>


0 commentaires