MDI Anwendung: Speichern beim Beenden

LieberNet

Mitglied
Hallo Zusammen!
Ich habe ein Problem bei einer MDI Anwendung das ich einfach nicht in den Griff bekomme.
MDI Anwendungen sind normalerweise so gestaltet, das wenn man ein Child schließt man gefragt wird, ob man das aktuell zu schließende Fenster (Objekt) speichern möchte. Das ist auch noch zu schaffen. Allerdings wenn der User dann das MdiParent (also Hauptfenster) beendet, dann würde für jedes offene Child diese Abfrage kommen. -> Messagebox Lawine die niemand brauchen kann. Also habe ich mal überlegt, ob man das nicht im MDI Parent erledigen kann. Tja und da beginnt dann auch schon mein Problem. Das Close() der MDI Childs erfolgt vor dem Close des Parents und mit Event Handler habe ich auch wieder das Problem, das diese synchron und nicht alle auf einmal ankommen.
Wie schafft man also folgende Anforderung:
Schließen eines Child -> Speichern? Ja/Nein/Abbrechen
Schließen des Parent -> Alles Speichern? Ja/Nein/Abbrechen (ohne messages der Childs)
Und wie kann ich das Schließen beim Abbrechen wirklich abbrechen.

Im Closing oder Closed Event ist es leider schon zu spät. Ich brauche also irgendwie die Möglichkeit den CloseButton der ControlBox als Event zu erhalten und dieses Event zu "killen" wenn jemand abbrechen drückt.

Vielleicht kann mir jemand von Euch helfen oder hat sogar ein kleines Beispiel. Bin mit meinem Latein schon etwas am Ende.
Danke
Ciao
Max
 
Im Closing-Event eine MessageBox mit Ja/Nein/Abbrechen. Wenn der User Abbrechen betätigt, dann einfach ein e.Cancel (e == EventArgs). Damit wird das Schließen der Form abgebrochen.
 
Hallo Norbert!

Code:
private void FRM_Form_Closing(object sender, ystem.ComponentModel.CancelEventArgs e)
{
                DialogResult dlgres =  MessageBox.Show ("Änderungen speichern?",
	this.Text, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question);

                if (dlgres == DialogResult.Cancel)
                {
                      e.Cancel = true;
                }
}
Funktioniert super! Muss dann "nur noch" rausfinden wie man das mit den Forms und den Messageboxen hinbekommt.
Danke!
Ciao
Max
 
Zuletzt bearbeitet:
Hallo Zusammen!
Hab im Internet noch was gefunden was mir diese Implementierung ermöglicht:
Durch überschreiben der WndProc Funktion kann das Schließen (MsgID = 0x0010) der Form abgefangen und behandelt werden. Alle anderen Messages einfach an die base Funktion weiterleiten:
Code:
protected override void WndProc(ref Message m)
{
   if (m.Msg != 0x0010)
   {
        // alle anderen messages an die base weiterleiten
        base.WndProc(m);
   }
   else
        // show messagebox and save childs
}

Das Speichern der einzelnen Formen habe ich in mit dem Closing Event der einzelnen Child Formen gemacht. Das Hauptfenster übernimmt in der WndProc das Speichern beim Programm beenden. Beim Closing der einzelnen Childs frage ich ab ob sich was geändert hat. Da dies das Parent beim Programm beenden bereits gespeichert hat, hat sich in den Childs beim Close somit nichts mehr geändert und es kommt auch keine Messagebox. Wenn man beim WndProc das Ganze (ist etwas zu speichern, und das anschließende Speichern) noch mit Events macht, dann ist das echt komfortabel. Man kann sich über die EventArguments alle zu speichernden Formen zusammensuchen und dadurch ein ähnliches Verhalten wie in der .Net Entwicklungsumgebung erreichen. Ausserdem kann man vor dem Schließen überprüfen ob das Speichern überhaupt erfolgreich war und man hat immer noch alle Fenster offen die vor dem Beenden auch geöffnet waren.

Ciao
Max
 
Zuletzt bearbeitet:
Zurück