Autor Beitrag
alegria
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Fr 30.10.09 17:49 
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?

ausblenden volle Höhe 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++;

                // erster Menueintrag
                ToolStripMenuItem a = new ToolStripMenuItem();
                a.Text = i.ToString() + "tes Land: " + info.Land;

                // zwei SubMenueintraege zum ersten Menueintrag
                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);
            }
        }

        // so wird das auch nur nix richtiges...
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Fr 30.10.09 18:59 
user profile iconalegria hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden C#-Quelltext
1:
2:
3:
x.Click += delegate {
  // in diesem Block hast du Zugriff auf alle lokalen Variablen wie "info"
};


PS: Eigene Typen bitte groß schreiben :D .

_________________
>λ=
alegria Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Fr 30.10.09 23:27 
Zitat:
Es ist ein etwas fortgeschritteneres Feature, aber hier passen anonyme Methoden einfach perfekt:
ausblenden C#-Quelltext
1:
2:
3:
x.Click += delegate {
  // in diesem Block hast du Zugriff auf alle lokalen Variablen wie "info"
};


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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 31.10.09 02:21 
user profile iconalegria hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
y.Click += delegate
                {
                    // in diesem Block hast du Zugriff auf alle lokalen Variablen wie "info"
                    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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Mo 02.11.09 13:22 
Argh, da hat mich die foreach-Schleife an der Nase herumgeführt :P . So muss es gehen:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 79



BeitragVerfasst: Mo 02.11.09 13:30 
Danke! Jetzt ist es klarer... Hätte man ja fast selbst drauf kommen können/müssen... ;)