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;
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);
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();
}
{
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);
}
}
{
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.
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;