Wie verhindere ich, dass ein Windows Forms Formular mehrfach geöffnet wird?
- Wie verhindere ich, dass ein Windows Forms Formular mehrfach geöffnet wird?
- Grundprinzip
- Ansatz mit einer Klassenvariable
- Beispielcode
- Alternative: Suche in den offenen Formularen
- Wichtige Hinweise
- Zusammenfassung
Wie verhindere ich, dass ein Windows Forms Formular mehrfach geöffnet wird?
In Windows Forms-Anwendungen kann es durchaus vorkommen, dass man ein Formular so steuern möchte, dass es nicht mehrmals gleichzeitig geöffnet wird. Wenn man beispielsweise aus einem Hauptformular heraus ein neues Formular öffnet, möchte man oft vermeiden, dass der Benutzer dieses Formular mehrfach öffnet, indem er z.B. mehrmals auf einen Button klickt. Dies kann zu unerwartetem Verhalten oder Ressourcenverschwendung führen.
Grundprinzip
Das grundlegende Vorgehen ist, dem Programm mitzuteilen, ob das gewünschte Formular bereits geöffnet ist oder nicht. Wenn es bereits geöffnet ist, soll das existierende Formular in den Vordergrund gebracht werden. Wenn es noch nicht geöffnet ist, soll es neu erstellt und angezeigt werden.
Ansatz mit einer Klassenvariable
Eine einfache Methode ist es, eine Klassenvariable (z.B. vom Typ des Formulars) im Hauptformular vorzuhalten, die die Instanz des geöffneten Unterformulars speichert. Beim Öffnen wird geprüft, ob diese Variable null ist oder das Formular bereits geschlossen wurde. Falls ja, wird ein neues Formular instanziiert; wenn nein, wird das bestehende Formular aktiviert.
Beispielcode
public partial class MainForm : Form{ // Variable, die die Referenz zum geöffneten Formular hält private Form2 form2Instance; public MainForm() { InitializeComponent(); } private void buttonOpenForm2_Click(object sender, EventArgs e) { // Prüfen, ob das Formular schon geöffnet ist oder geschlossen wurde if (form2Instance == null || form2Instance.IsDisposed) { form2Instance = new Form2(); form2Instance.Show(); } else { // Das bereits geöffnete Formular in den Vordergrund bringen if (form2Instance.WindowState == FormWindowState.Minimized) form2Instance.WindowState = FormWindowState.Normal; form2Instance.BringToFront(); form2Instance.Activate(); } }}
In diesem Beispiel gibt es einen Button buttonOpenForm2, der das zweite Formular öffnet. Die Variable form2Instance speichert die Instanz des geöffneten Formulars. Beim Klicken wird geprüft, ob das Formular bereits angezeigt wird oder geschlossen wurde. So wird verhindert, dass mehrere Instanzen von Form2 gleichzeitig geöffnet werden.
Alternative: Suche in den offenen Formularen
Eine andere Möglichkeit besteht darin, die Collection Application.OpenForms zu durchsuchen. Diese enthält alle aktuell geöffneten Formular-Instanzen. Man kann so prüfen, ob das gewünschte Formular schon offen ist und darauf zugreifen.
private void buttonOpenForm2_Click(object sender, EventArgs e){ // Prüfen, ob Form2 bereits geöffnet ist Form2 existingForm = Application.OpenForms.OfType<Form2>().FirstOrDefault(); if (existingForm == null) { Form2 form2 = new Form2(); form2.Show(); } else { if (existingForm.WindowState == FormWindowState.Minimized) existingForm.WindowState = FormWindowState.Normal; existingForm.BringToFront(); existingForm.Activate(); }}Dieser Ansatz eignet sich besonders, wenn man keine Klassenvariable vorhalten möchte oder beispielsweise das Öffnen aus verschiedenen Stellen im Programm erfolgt.
Wichtige Hinweise
Es ist wichtig zu prüfen, ob das Formular bereits geschlossen oder disposed wurde, da eine Instanz nach dem Schließen nicht mehr verwendet werden kann. Die Eigenschaft IsDisposed liefert diese Information. Außerdem ist es sinnvoll, das wiedergeöffnete Formular aus einem minimierten Zustand heraus zurückzuholen, damit der Nutzer es sofort sieht.
Zusammenfassung
Um zu verhindern, dass ein Windows Forms Formular mehrfach geöffnet wird, sollte man entweder eine Referenz zum geöffneten Formular speichern und prüfen, oder die offenen Formulare mit Application.OpenForms durchsuchen. Im Fall eines bereits geöffneten Formulars wird dieses aktiviert und in den Vordergrund gebracht, wodurch ein erneutes Öffnen überflüssig wird. Diese Vorgehensweise sorgt für eine bessere Benutzerführung und Ressourcenschonung.
