Entwickler-Ecke

C# - Die Sprache - menuStrip - Verständnisfrage, Items im Untermenue


Bömmel - Mo 18.02.13 20:19
Titel: menuStrip - Verständnisfrage, Items im Untermenue
Hallo.

Ich habe ein MenuStrip folgendermaßen aufgebaut:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
            menuStrip1.Items.Add("Eingang");
            menuStrip1.Items.Add("Funktionen");
            menuStrip1.Items.Add("Hilfe");
            ToolStripMenuItem Misc = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[2]).DropDownItems.Add("Misc");
            Misc.DropDownItems.Add("Anschlussbild");
            Misc.DropDownItems[0].Click += new EventHandler(menuEvent);
            Misc.DropDownItems.Add("User Manual");
            Misc.DropDownItems[1].Click += new EventHandler(menuEvent);
            ToolStripMenuItem Quelle = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Quelle");
            Quelle.DropDownItems.Add("Video");
            Quelle.DropDownItems[0].Click += new EventHandler(menuEvent);
            Quelle.DropDownItems.Add("Comp1");
            Quelle.DropDownItems[1].Click += new EventHandler(menuEvent);
            Quelle.DropDownItems.Add("Comp2");
            Quelle.DropDownItems[2].Click += new EventHandler(menuEvent);

...


Dazu der Eventhandler:

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:
        private void menuEvent(object sender, EventArgs e)
        {
            ToolStripItem item = (ToolStripItem)sender;
            int ArrZeile = 0;
            textBox3.Clear();
            for (int i = 0; i <= 49; i++)
            {
                if (commands[i, 2] == item.Text)
                {
                    ArrZeile = i;
                    textBox2.Text = commands[ArrZeile, 1];
                    textBox3.Text = item.Text;
                    dialog_einblenden();
                }
            }
            if (item.Text == "Anschlussbild")
            {
                pictureBox1.Size = new System.Drawing.Size(652196);
                pictureBox1.Location = new System.Drawing.Point(6084);
                pictureBox1.Visible = true;
            }
            if (item.Text == "User Manual")

...


Es funktioniert auch gut. Nun möchte ich aber für einige Funktionen die Möglichkeit haben, direkte Items anzusprechen.
Das mache ich folgendermaßen:

C#-Quelltext
1:
((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[2]).irgendwas                    

Hier komme ich aber nur bis in die direkten Menü-Unterpunkte.
Wie komme ich an die Items in den verschachtelten Untermenüs heran, z.B für checked o.ä.?


Ich hoffe, Ihr könnt mir helfen, Google ist schon leergesucht...

Grüße
Bömmel

PS: Bitte langsam schreiben, komme aus der Phyton/Perl-Ecke :D

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Th69 - Mo 18.02.13 20:38

Hallo und :welcome:

einfach weiter verschachtelt (mittels DropDownItems) darauf zugreifen, d.h.

C#-Quelltext
1:
((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[2]).DropDownItems[0]                    


Bömmel - Mo 18.02.13 21:12

Hallo Th69. Danke für die schnelle Antwort.

Das ist mein eigentliches Problem:

Ich komme bis hier:

C#-Quelltext
1:
((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).Checked = true;                    

Wenn ich nach dem letzten DropDownItems einen Punkt setze, wird mir das Objekt auch angeboten.
Setzte ich aber das Checked dran:

C#-Quelltext
1:
((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).DropDownItems[0].Checked = true;                    

Was jetzt als Objekt nicht zur Verfügung steht, erhalte ich logischerweise eine Fehlermeldung:

Quelltext
1:
"System.Windows.Forms.ToolStripItem" enthält keine Definition für "Checked", und es konnte keine Erweiterungsmethode "Checked" gefunden werden, die ein erstes Argument vom Typ "System.Windows.Forms.ToolStripItem" akzeptiert.                    

Gruß
Bömmel

Moderiert von user profile iconTh69: C#-Tags hinzugefügt


Ralf Jansen - Mo 18.02.13 21:37

Weil du den letzten Zugriff auch noch auf ToolStripMenuItem casten muss sonst hast du nur einen ToolStripDropDownItem Verweis der Checked noch nicht kennt.


Bömmel - Di 19.02.13 20:14

Hallo Leute, erstmal vielen Dank für die Hilfe.

Ich habe jetzt eine Lösung, die evtl. etwas "abstrakt" ist.
Vorteil ist, dass der ausgewählte Menüpunkt nicht mehr auszuwählen ist, da der geänderte Name im Array nicht mehr gefunden wird und so nichts auslösen kann:

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:
            if (item.Text == "Video")
            {
                senden("inv");
                MenueSelect("Video");
            }
            if (item.Text == "Comp1")
            {
                senden("in1");
                MenueSelect("Comp1");
            }
            if (item.Text == "Comp2")
            {
                senden("in2");
                MenueSelect("Comp2"); 
            }
        }
        private void MenueSelect(string Quelle)
        {
            ToolStripItem x = (((ToolStripMenuItem)  ((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).DropDownItems[0]);
            ToolStripItem y = (((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).DropDownItems[1]);
            ToolStripItem z = (((ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems[0]).DropDownItems[2]);

            if (Quelle == "Video")
            {
                x.Text = "Aktiv: " + x.Text;
                y.Text = "Comp1";
                z.Text = "Comp2";
            }
            else if (Quelle == "Comp1")
            {
                x.Text = "Video";
                y.Text ="Aktiv: " + y.Text;
                z.Text = "Comp2";
            }
            else if (Quelle == "Comp2")
            {
                x.Text = "Video";
                y.Text = "Comp1";
                z.Text = "Aktiv: " + z.Text;
            }
        }

Ist vielleicht für die Profis "frickelei", aber läuft...

Gruß

Bömmel

Moderiert von user profile iconTh69: C#-Tags hinzugefügt: demnächst bitte selber setzen, danke!