Laden...

Dynamisch erstellten Button ein Clickereignis hinzufügen

Erstellt von Peter7 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.275 Views
P
Peter7 Themenstarter:in
2 Beiträge seit 2011
vor 12 Jahren
Dynamisch erstellten Button ein Clickereignis hinzufügen

Ich sitze schon seit ein paar Tagen an einem Problem und selbst mit google habe ich bisher keine Lösung gefunden.

Zu meinem Programm. Ich hab mehrere TabPages mit unterschiedlichen Buttons. Wenn ich auf einen Button rechtsklicke, dann öffnet sich ein Kontextmenü, welches mir erlaubt einen neuen Button auf TabPage 1 zu erstellen. Der Button hat dann den selben Text und sollte auch die selbe Funktion haben, wie der Originalbutton.

Ich nutze auf allen Buttons dasselbe Kontextmenü und erhalten den Namen des Buttons mit Hilfe von Source Control des Kontextmenüs. Meine Idee war an diesen Namen einfach "_Click" anzuhängen und dann button.Click zuzuweißen.

Nur funktioniert dies nicht, weil ich button.Click keinen String zuweißen kann, sondern nur einen EventHandler.

Meine Frage lautet nun, wie kann ich einen neu erstellten Button, die entsprechende Clickroutine zuweißen, oder gibt es vielleicht doch einen Weg einen String in einen Eventhandler umzuwandeln.

Mfg Peter7

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Peter7,

Willkommen bei myCSharp.de

Du kannst da ja einfach jedem Button den selben Click EventHandler zuweisen.
Da brauchst du dann nichts mit strings machen.
Also mit myNewButton.Click += ...;

Gruß
Michael

P
Peter7 Themenstarter:in
2 Beiträge seit 2011
vor 12 Jahren

Danke erstmal für die schnelle Antwort.

Das Problem ist, dass der neue Button die selbe Funktion haben soll, wie das Original. Wenn ich deinen Vorschlag nutze, dann würde alle neuen Buttons die selbe Clickroutine haben und nicht dieselbe, wie das Original.

3.430 Beiträge seit 2007
vor 12 Jahren

Hallo Peter7,

achso, jetzt verstehe ich was das Problem ist.
Du hast also mehrere Buttons mit verschiedenen EventHandler.
Wenn auf einen Button geklickt wird (im context menü oder wo auch immer) dann willst du einen gleichen Button nochmal haben. Ok?

Wenn du da so direkt mit den Button arbeitest dann wird das vermutlich ein ziemliches Gefummel.
Besser ist es wenn du versuchst die GUI von der Logik zu trennen.
Dann wird das Ganze wesentlich einfacher.

Wenn du das nicht willst dann kannst du evtl. im Event vom Button abfragen was für ein Typ Button es ist und dementsprechend den passenden EventHandler zuweisen.

Gruß
Michael

I
8 Beiträge seit 2010
vor 12 Jahren

Kann man nicht die Delegates aus dem Eventhandler mittels Reflection auslesen, und damit dann einen Clone des Events machen?

So nach dem Prinzip hier: http://www.bobpowell.net/eventsubscribers.htm

Schöner wäre es aber definitiv wenn du eine Liste/Dictionary mit Delegates für deine Commands definierst und darin den Lookup machst, welcher Button welchen Command ausführen soll.

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo IsNull,

Kann man nicht die Delegates aus dem Eventhandler mittels Reflection auslesen,

Wozu? Beim ersten Button wird der EventHandler doch auch vom GUI gesetzt. Da sollte das GUI bei weiteren Buttons (mit derselben Funktion) weiterhin wissen, welches der richtige EventHandler ist, ohne ihn per Reflection auslesen zu müssen. Das bestätigst du ja im letzten Absatz deiner Antwort selbst und gibt auch gleich einen Tipp, wie das GUI die EventHandler verwalten kann. Reflection sollte man nur anwenden, wenn es sich nicht vermeiden lässt und hier lässt es sich problemlos vermeiden.

und damit dann einen Clone des Events machen?

Delegates sind Wert-Typen bzw. haben eine Werttypsemantik. Da muss man nichts clonen.

herbivore

I
8 Beiträge seit 2010
vor 12 Jahren

Hi herbivore,

Dass man sowas mit Delegates lösen sollte ist klar. u.U. ich würde sogar noch weiter gehen und solche User-Aktionen in Commands kapseln.

Mich hat lediglich interessiert dies so zu lösen wie sich der Threadersteller das vorgestellt hatte. Es ist bestimmt Quick & Dirty aber dafür auch ziemlich dynamisch. Es ist aber bestimmt auch nicht eine saubere Lösung, da gebe ich dir vollauf recht.

Wie dem auch sei, wir kennen die Umstände ja nicht. Wenn das Ganze hier z.B. als Ziel hat, Shortcuts von Commands auf verschiedenen Tab-Pages auf die Front-Seite zu legen, benötigt das noch weitere Behandlung - z.B. um keine doppelten Shortcuts anzulegen. Spätestens dann kommt man nicht um eine gescheite Verwaltung der Commands herum.

Mit clone meine ich eigentlich kopieren - das erstellen eines Events mit den gleichen Eigenschaften.
~ Delegate.Clone Method (System)
🙂