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 J'ai le code suivant maintenant: p> cliquez sur code>) sur le nouveau contrôle.
var btn2 = new Button();
btn2.Text = btn1.Text;
btn2.size = btn1.size;
// ...
btn2.Click ??? btn1.Click
5 Réponses :
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;
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 ();};
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
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.
La meilleure approche utilise une classe de composants et hériter de la commande à cette classe Vous pouvez modifier la classe partielle afin qu'il n'y ait pas besoin de créer des événements p> < / p>
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!
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);
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 code> comme
contextMenu code> Sous-éléments pour servir de menu de clic droit, mais en utilisant ceci pour copier les auditeurs de < Code> ToolstripMenuitem Code> Les objets dans le nouveau
Menuitem code> n'avaient aucun effet.
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"; %>
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?