Windows Forms: MDI-Anwendungen
Bei MDI-Anwendungen (Multiple Document Interface) haben wir immer ein Haupt-Formular und ein oder mehrere Sub-Formulare. Dadurch ist es möglich, mehrere Sub-Formulare (auch Frames genannt) in einem Fenster darzustellen. Alternative Konzepte, um mehrere Frames innerhalb eines Fensters darzustellen, sind SDI (Single Document Interface) und TDI (Tabbed Document Interface). Das heute gängigste Konzept ist TDI, welches z. B. in Editoren, Entwicklungsumgebungen und Browsern verwendet wird. Dies könnten wir zum jetzigen Zeitpunkt auch schon selbst realisieren (über TabControl und TabPage). Das SDI-Konzept wird z. B. im Bildbearbeitungsprogramm GIMP benutzt. Auch hier hätten wir aus dem jetzigen Wissensstand keine Probleme. MDI-Anwendungen wurden früher bei Office-Anwendungen (u. U. Microsoft Office) und anderen eingesetzt. Doch wie wird ein solches Konzept per Programmierung realisiert?
Um die MDI-Funktionalität nutzen zu können, müssen wir im Haupt-Formular die Eigenschaft IsMdiContainer auf true setzen. Das Frame wird über den Programmcode dynamisch erstellt und mit der Funktion Show() angezeigt. Bevor wir das Fenster anzeigen, müssen wir jedoch die Eigenschaft MdiParent des Frames auf das Objekt des Haupt-Formulars setzen. Hierfür kann zumeist das Schlüsselwort this verwendet werden. Die Eigenschaft ActiveMdiChild enthält das aktiv ausgewählte Sub-Formular oder null, falls kein Frame aktiv bzw. geöffnet ist. Die Eigenschaft MdiChildren enthält ein Array von Formularen, welche dem MDI-Container zugewiesen sind. Die Eigenschaft kann nur gelesen und nicht verändert werden. Die Zuordnung eines Frames zu der Eigenschaft des Haupt-Formulars erfolgt automatisch durch die Zuweisung der Eigenschaft MdiParent des Frames.
MainForm.cs
private void menuStripHauptfenster_ItemClicked(object sender, EventArgs e) { ToolStripMenuItem oMenuItem = (ToolStripMenuItem)sender; if (oMenuItem == neuesÖffnenToolStripMenuItem) { SubForm oSubForm = new SubForm(); oSubForm.MdiParent = this; oSubForm.Show(); aktuellesSchließenToolStripMenuItem.Enabled = true; alleSchließenToolStripMenuItem.Enabled = true; } else if (oMenuItem == aktuellesSchließenToolStripMenuItem) { this.ActiveMdiChild.Close(); if (this.ActiveMdiChild == null) { aktuellesSchließenToolStripMenuItem.Enabled = false; alleSchließenToolStripMenuItem.Enabled = false; } } else if (oMenuItem == alleSchließenToolStripMenuItem) { foreach (Form oSubForm in this.MdiChildren) oSubForm.Close(); aktuellesSchließenToolStripMenuItem.Enabled = false; alleSchließenToolStripMenuItem.Enabled = false; } else if (oMenuItem == beendenToolStripMenuItem) { Close(); } }