Site logo
Site logo
Programmieren aus Leidenschaft
Programmieren aus Leidenschaft

MDI Formulare (Teil 2) - MenuMerge


Schon seit den frühen Tagen der grafischen Benutzeroberflächen waren Menus ein wichtiger Bestandteil von Programmen. Ist eine einfache Menuleiste für einen geübten Programmierer längst keine Herausforderung mehr, so gibt es bei MDI-Anwendungen einiges zu beachten. Hier ist es beispielsweise möglich, die Menuleisten von Eltern- und Kindformular zu verbinden. Und das funktioniert sogar fast automatisch. Wie genau, das erfahren Sie auf dieser Seite.
MenuStrip meinMenu = new MenuStrip();
meinMenu.AllowMerge = true;
this.MainMenuStrip = meinMenu;
Diese drei Zeilen sind schon fast das ganze Geheimnis der automatischen Menu Verbindungen (engl. Menu Merge). Zuerst müssen wir für unser Menu das Verbinden generell erlauben. Das geschieht durch AllowMerge = true. Ebenfalls wichtig ist, dass wir unser Menu zum Hauptmenu des Formulars bestimmen. Anschließend können wir unserem Menu Gruppen und Unterpunkte hinzufügen.
ToolStripMenuItem ersteMenuGruppe = new ToolStripMenuItem();
ersteMenuGruppe.Text = "Funktionen";
meinMenu.Items.Add(ersteMenuGruppe);

ToolStripMenuItem zweiteMenuGruppe = new ToolStripMenuItem();
zweiteMenuGruppe.Text = "Datei";
meinMenu.Items.Add(zweiteMenuGruppe);

ToolStripMenuItem unterpunk1 = new ToolStripMenuItem();
unterpunk1.Text = "Kind erzeugen";
unterpunk1.Click += new EventHandler(unterpunkt1_Click);

ToolStripMenuItem unterpunkDatei = new ToolStripMenuItem();
unterpunkDatei.Text = "Laden";

ersteMenuGruppe.DropDownItems.Add(unterpunk1);
zweiteMenuGruppe.DropDownItems.Add(unterpunkDatei);

this.Controls.Add(meinMenu);
Das Menu bekommt die Gruppen "Funktionen" und "Datei" angehängt. Diese wiederum die Unterpunkte "Kind erzeugen" und "Datei". Für "Kind erzeugen" gibt es dann auch einen Event, die Methode dazu sieht so aus:
void unterpunkt1_Click(object sender, EventArgs e)
{
   KindFormular meinKind = new KindFormular();
   meinKind.MdiParent = this; meinKind.Show();
}
Wie man sieht, erzeugt diese Methode Instanzen der Klasse "KindFormular". Auch diese Klasse braucht natürlich ein Menu, denn unser Ziel ist es ja, beide Menus zu verbinden. So eine Klasse zu programmieren ist nicht schwer und unterscheidet sich nur wenig von der Klasse des Elternformulars.
class KindFormular : Form
{
   public KindFormular ()
   {
      this.Text = "Ich bin ein Kindformular";

      MenuStrip meinMenu = new MenuStrip();
      meinMenu.AllowMerge = true;

      ToolStripMenuItem ersteMenuGruppe = new ToolStripMenuItem();
      ersteMenuGruppe.Text = "Datei";
      ersteMenuGruppe.MergeAction = MergeAction.MatchOnly;
      meinMenu.Items.Add(ersteMenuGruppe);

      ToolStripMenuItem unterpunk1 = new ToolStripMenuItem();
      unterpunk1.Text = "Speichern";
      unterpunk1.MergeAction = MergeAction.Insert;
      unterpunk1.MergeIndex = 1;
      ersteMenuGruppe.DropDownItems.Add(unterpunk1);

      ToolStripMenuItem unterpunk2 = new ToolStripMenuItem();
      unterpunk2.Text = "Prüfen";
      unterpunk2.MergeAction = MergeAction.Insert;
      unterpunk2.MergeIndex = 2;
      ersteMenuGruppe.DropDownItems.Add(unterpunk2);

      this.Controls.Add(meinMenu);
   }
}
Hier finden wir jetzt ein paar für uns noch unbekannte Befehle. Die wichtigste Eigenschaft ist die sogenannte "MergeAction". Sie bestimmt das Verhalten der beiden Menus zueinander. Zuerst aber eine wichtige Frage: Unter welchen Gesichtspunkten werden die beide Menus verbunden? Es ist die Eigenschaft "Text", der einzelnen ToolStripMenuItem. An dieser Eigenschaft erkennen sich die Items.

In diesem Beispiel werden an die Gruppe "Datei" im Elternmenu zwei weitere Unterpunkte angehängt. Ändern wir eine der Text-Eigenschaften, geschieht das nicht mehr. Schreiben wir vielleicht aus Versehen "Dateo" statt "Datei" so wird keine Verbindung mehr hergestellt, da es keinen gemeinsamen Namen gibt. Erst der übereinstimmende Name mit der MergeAction "MatchOnly" verbindet die Menus.

Es ist aber auch möglich, die Gruppe "Datei" im Elternformular komplett zu ersetzen oder noch eine "Datei"-Gruppe anzuhängen. Insgesamt gibt es sechs verschiedene MergeAction.

Append, Insert, MatchOnly, Remove, Replace

Auch "Insert" kommt in diesem Beispiel zum Einsatz - wollen wir doch der Gruppe "Datei" weitere Unterpunkte hinzufügen. Die Eigenschaft des "MergeIndex" bestimmt die Reihenfolge des Menupunktes. Ein Umsortieren die einzelnen Unterpunkte ist dadurch möglich.

Würden wir den Programmcode so belassen, hätten wir im Kindformular immer noch ein Menu mit der Gruppe "Datei". Diese Gruppe ist allerdings leer, denn die beiden Unterpunkte sind nun im Menu des Elternformulars. Da dieses Menu wenig Sinn macht, ist der beste Weg es loszuwerden, es unsichtbar zu machen.
meinMenu.Visible = false;