Dienstag, 7. Dezember 2010

Menüs und Untermenüs dynamisch hinzufügen

In diesem Post widme ich mich den Menüsteuerelementen in C# und zeige, wie man Menüs und Untermenüs zur Laufzeit hinzufügen kann.
Wie ich feststellen musste, ist diese Funktion nämlich nicht ganz klar ersichtlich.
Ich zeige hier meine Methode die über ein paar Umwege läuft, wer also direkteren Code kennt bitte Bescheid sagen.
Ziel des Beispielprogramms soll es sein, folgende Menüstruktur zu erzeugen:

Wir ziehen nun erstmal mit dem Designer ein Steuerelement vom Typ menuStrip auf das Formular (kann natürlich auch dynamisch gemacht werden, siehe Steuerelemente zur Laufzeit hinzufügen).
Nun wird lediglich oben im Formular eine noch unsichtbare Menüleiste bereitgestellt, die aber noch leer ist.
Im Designer kann man jetzt in diese schreiben, um Menüs zu erstellen, wir beschränken uns jedoch auf den dynamischen Teil.
Obermenüs, also Menüs auf höchster Ebene in der Menüleiste (im Beispiel "Obermenü 1" und "Obermenü 2") können über das Attribut Items der Klasse menuStrip bearbeitet werden.
Folgende Codezeilen legen die 2 Obermenüs an:

menuStrip1.Items.Add("Obermenü 1");
menuStrip1.Items.Add("Obermenü 2");

Über einen Index (z.B. über menuStrip1.Items[0]) können wir nun auf die Menüeinträge zugreifen, in diesen aber keine Untermenüs anlegen.
Dafür müssen wir das Objekt explizit in ein Objekt vom Typ ToolStripMenuItem konvertieren. Dieses hat nun die Eigenschaft DropDownItems, über die wir Untermenüs anlegen können.
Um beispielsweise die Untermenüs "Untermenü 1" und "Untermenü 2" zu erzeugen, führen wir folgenden Code aus:

((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Untermenü 1");        
((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Untermenü 2");

Diese Untermenüs sind nun so ersteinmal nicht mehr greifbar. Wir brauchen sie jedoch, wenn wir weitere Untermenüs anlegen wollen, die nach rechts aufklappen (im Beispiel "rechtes Untermenü 1" und "rechtes Untermenü 2").
Deswegen speichern wir einfach beim Anlegen des Untermenü dieses in einem Objekt vom Typ ToolStripMenuItem, z.B. so:

ToolStripMenuItem Untermenue1 = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Untermenü 1");

(Vor der Zuweisung muss wieder eine explizite Typumwandlung stehen.)
Nun haben wir über die Variable dauerhaft Zugriff auf das gewünschte Untermenü, und können diesem über DropDownItems.Add() eigene Untermenüs hinzufügen.
Hier zum Abschluss der komplette Beispielcode:

            menuStrip1.Items.Add("Obermenü 1");
            menuStrip1.Items.Add("Obermenü 2");

            ToolStripMenuItem Untermenue1 = (ToolStripMenuItem)((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Untermenü 1");
            ((ToolStripMenuItem)menuStrip1.Items[0]).DropDownItems.Add("Untermenü 2");

            Untermenue1.DropDownItems.Add("rechtes Untermenü 1");
            Untermenue1.DropDownItems.Add("rechtes Untermenü 2");

Keine Kommentare:

Kommentar veröffentlichen