Entwickler-Ecke
C# - Die Sprache - Click-Events dynamisch beim Kompilieren erzeugen
alegria - Fr 30.10.09 17:49
Titel: Click-Events dynamisch beim Kompilieren erzeugen
Hallo!
Also ich hab eine Menüstruktur mit Submenüeinträgen. Anzahl der Submenüs ist konstant (hier: Hauptstadt + Sprache), die der eigentlichen Menüeintrage hingegen nicht (hier: Land). Später muss ich aber irgendwie Informationen des entsprechenden Submenüeintrages verarbeiten.
Wenn ich also bspw. auf Berlin klickere, soll ich auch ohne Probleme die Sprache deutsch bzw. das Land Deutschland rausbekommen können. Also im Idealfall wäre der Rückgabewert der Index meiner Liste "myList". Wie bekomme ich sowas am besten hin?
Wie erstellt man denn prinzipiell dynamisch die EventHandler wenn man nicht weiss wie viele es wohl mal werden?
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
namespace WindowsFormsApplication1 { public partial class Form1 : Form { private List<myType> myList = new List<myType>();
public Form1() { InitializeComponent(); myList.Add(new myType(new string[] {"Deutschland", "Berlin", "deutsch"})); myList.Add(new myType(new string[] {"Spanien", "Madrid", "spanisch"})); }
private void Form1_Load(object sender, EventArgs e) { int i = 0;
foreach (myType info in myList) { i++;
ToolStripMenuItem a = new ToolStripMenuItem(); a.Text = i.ToString() + "tes Land: " + info.Land;
ToolStripMenuItem x = new ToolStripMenuItem(); x.Text = info.Hauptstadt; x.Click += new EventHandler(x_Click); ToolStripMenuItem y = new ToolStripMenuItem(); y.Text = info.Sprache;
a.DropDownItems.AddRange(new ToolStripItem[] { x, y }); toolStripDropDownButton1.DropDownItems.Add(a); } }
void x_Click(object sender, EventArgs e) { if (sender.ToString() == "Berlin") { MessageBox.Show("Du hast Berlin geklickt..."); } else { MessageBox.Show("Du hast NICHT Berlin geklickt..."); } }
}
public class myType { public myType(string[] info) { Land = info[0]; Hauptstadt = info[1]; Sprache = info[2]; }
public String Land { get; private set; } public String Hauptstadt { get; private set; } public String Sprache { get; private set; } } } |
Kha - Fr 30.10.09 18:59
alegria hat folgendes geschrieben : |
| Wie erstellt man denn prinzipiell dynamisch die EventHandler wenn man nicht weiss wie viele es wohl mal werden? |
Das sieht bei dir doch schon recht dynamisch aus :nixweiss: ?
Es ist ein etwas fortgeschritteneres Feature, aber hier passen anonyme Methoden einfach perfekt:
C#-Quelltext
1: 2: 3:
| x.Click += delegate { }; |
PS: Eigene Typen bitte groß schreiben :D .
alegria - Fr 30.10.09 23:27
| Zitat: |
Es ist ein etwas fortgeschritteneres Feature, aber hier passen anonyme Methoden einfach perfekt:
C#-Quelltext 1: 2: 3:
| x.Click += delegate { }; | |
Und dann? delegate was? Kannst Du nicht noch 2 Zeilen in die Klammer schreiben damit ich es ein wenig besser nachvollziehen kann?
So wie ich das
| Zitat: |
| // in diesem Block hast du Zugriff auf alle lokalen Variablen wie "info" |
verstehe, würde ich bei Klick auf Berlin mit info.Hauptstadt "Berlin" abrufen können und beim Klick auf Madrid würde info.Hauptstadt = "Madrid" sein???
P.S. Sorry fürs schwer verstehen... ;)
Kha - Sa 31.10.09 02:21
alegria hat folgendes geschrieben : |
| verstehe, würde ich bei Klick auf Berlin mit info.Hauptstadt "Berlin" abrufen können und beim Klick auf Madrid würde info.Hauptstadt = "Madrid" sein??? |
Na also, du hast es ohne weitere Erklärung bereits begriffen :think: . In den Block kannst du genauso wie im Eventhandler Code einfügen, der bei einem Klick ausgeführt werden soll, statt
sender kannst du aber, wie du selbst schon gesagt hast, direkt auf
info zugreifen.
alegria - Mo 02.11.09 10:03
Mmhhh... Also "gelöst" hab ich mein Problem zwar nun (s. unten), aber bei
| Zitat: |
| In den Block kannst du genauso wie im Eventhandler Code einfügen, der bei einem Klick ausgeführt werden soll, statt sender kannst du aber, wie du selbst schon gesagt hast, direkt auf info zugreifen. |
muss ich widersprechen.
In meinem Codebeispiel füge ich beispielhaft folgenden Dreizeiler hinzu:
C#-Quelltext
1: 2: 3: 4: 5:
| y.Click += delegate { MessageBox.Show("You clicked " + y.Text + info.Sprache); }; |
Und nun wird bei klick auf deutsch angezeigt: "You clicked deutschspanisch" und bei spanisch "You clicked spanischspanisch"! Also inwiefern hab ich da nun den tollen Zugriff auf info??? Da wird doch immer nur der letzte info Eintrag genommen?
Kha - Mo 02.11.09 13:22
Argh, da hat mich die foreach-Schleife an der Nase herumgeführt :P . So muss es gehen:
C#-Quelltext
1: 2: 3: 4: 5:
| myType currentInfo = info; y.Click += delegate { MessageBox.Show("You clicked " + y.Text + currentInfo.Sprache); }; |
Denn in der Schleifenvariable
info steht am Ende der Methode der letzte Eintrag, weshalb sie in einer Variablen
innerhalb des Schleifenkörpers kopiert werden muss (was du mit y ja quasi auch gemacht hast).
alegria - Mo 02.11.09 13:30
Danke! Jetzt ist es klarer... Hätte man ja fast selbst drauf kommen können/müssen... ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!