Domanda

Sto scrivendo ciò che si riduce a un editor di documenti. Quando l'applicazione si chiude, devo richiedere all'utente di salvare le modifiche. Questo è abbastanza facile. La mia domanda è quando è opportuno non richiedere all'utente e invece semplicemente scartare i dati non salvati e chiudere.

Nell'evento FormClosing, l'enum CloseReason include:

  • Nessuno
  • WindowsShutDown
  • MdiFormClosing
  • UserClosing
  • TaskManagerClosing
  • FormOwnerClosing
  • ApplicationExitCall

Immagino che WindowsShutDown e TaskManagerClosing non dovrebbero causare un " salvare le modifiche? " richiesta di visualizzazione, per evitare che l'app si blocchi con la visualizzazione di tale richiesta.

È questa pratica standard o dovrei fare qualcos'altro qui?

Per chiarezza, ecco il codice:

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;
        }
    }
}
È stato utile?

Soluzione

Penso che TaskManagerClosing dovrebbe essere l'unico motivo che non richiede, se presente. Personalmente, vorrei essere richiesto in caso di WindowsShutDown . Se chiudo Windows con un documento non salvato da qualche parte, significa che me ne sono dimenticato.

Altri suggerimenti

Mostrerei sicuramente anche " Vuoi salvare " finestra di dialogo su WindowsShutDown (l'applicazione potrebbe ad esempio essere stata in background per un po 'di tempo e l'utente se ne è dimenticato, oppure potrebbe aver cliccato su " Riavvia " dopo che un service pack è stato installato senza pensarci due volte ecc.).

Per quanto riguarda TaskManagerClosing, in questo caso non mostrerei la finestra di dialogo.

Personalmente preferisco semplicemente chiudere il programma quando l'utente seleziona chiudi, se ci sono documenti non salvati alla chiusura, preferisco conservare copie di backup di quei file e informare l'utente che ci sono documenti non salvati quando apriranno successivamente l'applicazione .

Faccio questo per un paio di motivi, numero uno Mi piace che le mie applicazioni si chiudano quando dico loro di chiudere, e numero due mantenendo una copia temporanea del file che aggiorno con tutte le modifiche mentre l'utente lavora lo proteggo da crash e chiusure impreviste delle mie applicazioni.

Quindi con questa tecnica non devi preoccuparti di come l'applicazione è stata chiusa.

Davvero CloseReason è un punto controverso, non è vero? Il fatto che il tuo modulo stia andando via è ciò che stai cercando di catturare.

Ora devi sapere se la tua applicazione ha già gestito il " save " evento. In tal caso, il modulo può andare via. Hai salvato il tuo documento. In caso contrario, potresti richiedere all'utente.

Se riesci a convalidare rapidamente i dati (ad es. fare un confronto tra stringhe o hash sul documento rispetto ai dati nel file), saprai se l'utente ha salvato i dati del modulo.

Altrimenti, se ci sono molti campi e il controllo di ciascuno è proibitivo in termini di risorse, allora metti un "isDirty" bandiera sul tuo modulo. Consenti al metodo Save () di impostare isDirty su false e ogni altra modifica del campo lo imposta su true.

Quindi, in formClosing, tutto ciò che serve è:

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;
        }
    }
}

Penso che anche TaskManagerClosing potrebbe usare un prompt per salvare. Se la tua app risponde normalmente, chiuderla tramite il task manager non dovrebbe essere diversa da qualsiasi altro modo di chiuderla. Se è bloccato, non importa cosa fa il tuo gestore onClose - non ci arriverà mai.

Sono d'accordo con @Jerry, in quanto è più importante evitare di chiedere di salvare se i dati non sono cambiati dall'ultimo salvataggio. Di solito uso un semplice flag "modificato", che viene impostato su qualsiasi azione di modifica e cancellato su salvataggi e caricamenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top