Frage

Ich schreibe, was mit einem Dokument-Editor läuft darauf hinaus. Wenn die Anwendung geschlossen wird, muss ich den Benutzer aufzufordern, die Änderungen zu speichern. Das ist einfach genug. Meine Frage ist, wann ist es angebracht, nicht fordert den Benutzer auf, und stattdessen einfach nicht gespeicherten Daten zu verwerfen und zu schließen.

In der Formclosing Ereignis, das CloseReason Enum enthält:

  • Keine
  • WindowsShutDown
  • MdiFormClosing
  • UserClosing
  • TaskManagerClosing
  • FormOwnerClosing
  • ApplicationExitCall

Ich vermute, dass WindowsShutDown und TaskManagerClosing sollte nicht dazu führen, „Änderungen speichern?“ Eingabeaufforderung angezeigt werden, die App aus hängend mit dieser Aufforderung zeigt zu verhindern.

Ist dies gängige Praxis, oder sollte ich etwas anderes hier tun?

Aus Gründen der Übersichtlichkeit hier ist der Code:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    base.OnFormClosing(e);

    if (!(e.CloseReason == CloseReason.WindowsShutDown || e.CloseReason == CloseReason.TaskManagerClosing)
            && this.ChangesPending())
    {
        switch (MessageBox.Show(this, "Save changes?", "Save Changes", MessageBoxButtons.YesNoCancel))
        {
            case DialogResult.Yes:
                this.Save();
                break;
            case DialogResult.No:
                // Do nothing
                break;
            case DialogResult.Cancel:
                e.Cancel = true;
                break;
        }
    }
}
War es hilfreich?

Lösung

Ich denke, TaskManagerClosing der einzige Grund sein sollte, der nicht aufgefordert, falls vorhanden. Persönlich würde ich mag im Fall WindowsShutDown aufgefordert werden. Wenn ich irgendwo herunter von Windows mit einem nicht gespeicherten Dokument nach unten, es bedeutet, dass ich es vergessen habe.

Andere Tipps

Ich würde auf jeden Fall zeigen auch die „Wollen Sie speichern möchten“ Dialog auf WindowsShutDown (die Anwendung könnte zB haben im Hintergrund für einige Zeit und der Benutzer es vergessen, oder er könnte geklickt haben auf „Restart“ nach ein Service Pack wurde bedenkenlos etc.) installiert.

Wie für TaskManagerClosing, ich würde nicht den Dialog in diesem Fall zeigen.

Ich persönlich bevorzuge nur das Programm zu schließen, wenn der Benutzer nahe auswählt, wenn es nicht gespeicherte Dokumente zu schließen Zeit sind ziehe ich Sicherungskopien dieser Dateien zu halten und den Benutzer darüber informieren, dass es nicht gespeicherte Dokumente sind, wenn sie die Anwendung nächste öffnen .

Ich tue dies für eine Reihe von Gründen, die Nummer eins Ich mag meine Anwendungen zu schließen, wenn ich ihnen sage, zu schließen, und die Nummer zwei durch eine temporäre Kopie der Datei zu speichern, die ich mit allen Änderungen aktualisieren, wenn der Benutzer arbeitet auf es mir Absicherung gegen unerwartete Abstürze und schließt meine Anwendungen.

Also mit dieser Technik müssen Sie nicht darum kümmern, ow die Anwendung geschlossen wurde.

Wirklich ist die CloseReason ein strittiger Punkt, ist es nicht? Die Tatsache, dass das Formular geht weg ist, was Sie zu fangen versuchen.

Nun müssen Sie wissen, ob Ihre Anwendung bereits die „save“ Ereignis behandelt hat. Wenn ja, kann das Formular weggehen. Sie haben Ihr Dokument gespeichert. Aber wenn nicht, sollten Sie den Benutzer aufzufordern.

Wenn Sie die Daten schnell überprüfen können (das heißt nicht ein String vergleichen oder Hash vergleicht auf dem Dokument im Vergleich zu den Daten in der Datei), dann werden Sie wissen, wenn der Benutzer die Formulardaten gespeichert hat.

Ansonsten, wenn es gibt eine Menge von Feldern, und die Überprüfung jeder Ressource-unerschwinglich ist, dann legt eine „isDirty“ Flagge auf dem Formular. Lassen Sie die Save () Methode, um die isDirty auf false gesetzt, und jede andere Feldänderung setzt es auf true gesetzt.

Dann in Formclosing, alles, was Sie brauchen, ist:

protected override void OnFormClosing(FormClosingEventArgs e)
{
    if (isDirty) 
    {
        DialogResult R = MessageBox.Show(this, "Save changes?", "Save Changes", 
                MessageBoxButtons.YesNoCancel);

        if (R == DialogResult.Yes)
        {
            this.Save();
        } else if (R == DialogResult.Cancel)
        {
            e.Cancel = true;
        }
    }
}

Ich würde denken sogar TaskManagerClosing eine Aufforderung verwenden könnte zu speichern. Wenn Ihre App reagieren normalerweise, es durch den Task-Manager zu schließen sollte nicht anders als jede andere Art und Weise sein, es zu schließen. Wenn es aufgehängt ist, spielt es keine Rolle, was Ihr onClose Handler tut -. Es nie bekommen

ich mit @Jerry zustimmen, dass es wichtiger ist, aufgefordert zu vermeiden, zu speichern, wenn die Daten, da es nicht geändert haben die letzten speichern. Normalerweise verwende ich eine einfache ‚geändert‘ Flagge, die auf jeder Bearbeitungsaktion gesetzt werden, und gelöscht auf Speicher und Laden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top