2010-02-05 6 views
2

J'ai un gestionnaire d'événement de clic de bouton qui indique this.Close()Nouveau thread requis sur FormClosing?

Dans l'événement FormClosing je détecte les modifications non enregistrées et dit "Voulez-vous enregistrer?" Si elles disent Oui, je règle e.Cancel = true, puis j'appelle ma méthode Save. Si les données sont sauvegardées ok dans ma méthode Save à la fin je dis this.Close() mais le formulaire reste ouvert.

Cela semble une idée si simple, mais je ne peux pas le résoudre.

Ai-je besoin de créer un nouveau fil dans FormClosing s'ils disent oui e.Cancel = true défini et créer un nouveau thread pour la Save qui sera ensuite appeler le this.Close()

+1

S'il vous plaît, pour l'amour de tout ce qui est sacré ** NE PAS ** appeler ceci.Fermer() à partir de l'événement de clôture du formulaire. Voir aussi: Récursion infinie. – Powerlord

Répondre

2

Si ils disent Oui, je mets e.Cancel = true, puis appelle ma méthode Save. Si les données sont sauvegardées ok dans ma méthode Save à la fin je dis cela.Fermer() mais le formulaire reste ouvert

Modifiez cela.

  • invite l'utilisateur
  • Si on dit oui, définissez e.Cancel = !Save()
  • S'ils disent non, définissez e.Cancel = true

Cela fera la forme étroite moins disent-ils pas lorsque vous êtes invité, ou la routine Save() échoue. Aucun nouveau thread ou thread n'est requis, juste un léger changement dans la logique.

+0

Pour le moment, la méthode Save ne renvoie pas de booléen, donc je devrai le faire. Merci – Jon

+0

Eh bien, vous avez mentionné que la sauvegarde pourrait échouer - ce serait juste une question de réglage de e.Cancel == true si Save échoue. Rendre Save() retourner un booléen rendrait cela simple, cependant. –

3

Il semble que ce que vous voulez faire ne soit PAS réglé e.Annuler à vrai, mais appelez simplement Save() sous condition de FormClosing. Vous annulez seulement si l'enregistrement échoue. Par exemple:

private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    if (IsDataModified()) // check if the data is unsaved...however you do so 
    { 
     // display a message asking the user to save changes or abort. 
     if(MessageBox.Show("Do you want to save your changes?", 
         "My Application", 
         MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      if(!SaveChanges();) 
       e.Cancel = true; // save did not succeed! 
     } 
    } 
} 
+0

Pour le moment, la méthode Save ne renvoie pas de booléen, donc je devrai le faire. Merci – Jon

+0

@Jon: En fonction des conditions qui pourraient provoquer l'échec/succès de l'enregistrement, vous devrez peut-être ajouter un 'try/catch' autour de l'appel dans 'OnFormClosing'. Je n'utiliserais pas d'exceptions comme moyen de contrôle de flux, mais il n'est pas souhaitable que votre application plante avec une exception non gérée, tout comme l'utilisateur en sort non plus. – LBushkin

Questions connexes