Vous devez être membre et vous identifier pour publier un article.
Les visiteurs peuvent toutefois commenter chaque article par une réponse.

Sauver l'état d'une fenêtre en C# (paramètres utilisateur

Astuces de l’Infobrol (dotNet)Article publié le 12/03/2007 13:21:32


Quand un utilisateur ferme une application, il désire souvent retrouver son application dans l’état dans lequel elle se trouvait au moment de sa fermeture.

J’ai donc appliqué ce principe à l’application Bibliobrol, et je désirais sauver les paramètres de la fenêtre principale au moment de sa fermeture.


En C#, il est très facile de lier les propriétés des composants graphiques à un fichier de configuration pour l’utilisateur. Il suffit de procéder de la manière suivante :

  • Dans le panneau Explorateur de solution, ouvrir par un double clic le fichier .settings (par défaut Settings.settings, qui se trouve dans le nœud propriétés)

  • Introduire un nom pour la propriété, son type, son étendue (scope), et sa valeur par défaut.

  • Comme ce paramètre sera spécifique à l’utilisateur et non à l’application (il sera sauvé dans les local settings de l’utilisateur), nous choisissons l’étendue utilisateur.

  • Sélectionner un composant en mode design, et ouvrir l’onglet Propriétés, Data, ApplicationSettings, PropertyBinding

  • Cliquer dans la zone valeur (un bouton avec trois petits points apparaît) pour ouvrir la fenêtre de liaisons de propriétés.
    Dans la fenêtre de liaisons de propriétés, sélectionner la propriété à lier, puis sélectionner le nom que nous avions donné à cette propriété dans le fichier de configuration.




Il ne nous reste plus qu’à spécifier à l’application qu’au moment de la fermeture il ne faut pas oublier de sauver les paramètres.

  1. private void Form1_FormClosing(object sender, FormClosingEventArgs e)
  2. {
  3. Properties.Settings.Default.Save();
  4. }


Et voilà, rien de bien compliqué.


Le seul hic, c’est que si cette manipulation fonctionne à merveille pour les composants, cela ne semble pas fonctionner pour l’état de la fenêtre.

Nous pouvons utiliser différentes méthodes

Gérard Leblanc nous propose d’utiliser la base de registre pour sauver ces valeurs.

  1. private void Form1_Load(object sender, EventArgs e)
  2. {
  3. RegistryKey rkcu = Registry.CurrentUser;
  4. RegistryKey rk = rkcu.OpenSubKey(@"Software\Eyrolles\Leblanc\Config\Registry", true);
  5. if (rk != null)
  6. {
  7. int W, H, X, Y;
  8. try
  9. {
  10. X = Convert.ToInt32(rk.GetValue("X"));
  11. Y = Convert.ToInt32(rk.GetValue("Y"));
  12. W = Convert.ToInt32(rk.GetValue("W"));
  13. H = Convert.ToInt32(rk.GetValue("H"));
  14. Location = new Point(X, Y);
  15. Size = new Size(W, H);
  16. this.StartPosition = FormStartPosition.Manual;
  17. }
  18. catch (Exception) { }
  19. }
  20. }
  21.  
  22. private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  23. {
  24. RegistryKey rkcu = Registry.CurrentUser;
  25. RegistryKey rk = rkcu.CreateSubKey(@"Software\Eyrolles\Leblanc\Config\Registry");
  26. rk.SetValue("X", this.Location.X);
  27. rk.SetValue("Y", this.Location.Y);
  28. rk.SetValue("W", this.Width);
  29. rk.SetValue("H", this.Height);
  30. rk.Flush(); rk.Close();
  31. }


Pour ma part, j’ai préféré utiliser le fichier de configuration

  1. private void MainForm_Load(object sender, EventArgs e)
  2. {
  3. try
  4. {
  5. WindowState = (FormWindowState)Enum.Parse(
  6. typeof(FormWindowState),
  7. ConfigurationManager.AppSettings["mainFormState"]
  8. );
  9. }
  10. catch (Exception) { WindowState = FormWindowState.Normal; }
  11. }
  12.  
  13. private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  14. {
  15. Config.saveAppSetting("mainFormState", Enum.GetName(typeof(FormWindowState), WindowState));
  16. }


Et voici la méthode statique que j'utilise dans la classe Config :
  1. public static bool saveAppSetting(String key, String value)
  2. {
  3. String exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "BiblioBrol.exe");
  4. Configuration config = ConfigurationManager.OpenExeConfiguration(exePath);
  5. try
  6. {
  7. config.AppSettings.Settings[key].Value = value;
  8. ConfigurationManager.AppSettings[key] = value;
  9. }
  10. catch (NullReferenceException nre)
  11. {
  12. Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.criticalError, "Sauvegarde d'une valeur de configuration", "Soit le fichier de configuration n'est pas présent (il doit se trouver dans le même répertoire que l'application), soit il est incomplet ou endommagé.", nre, Config.instance));
  13. }
  14. catch (Exception e)
  15. {
  16. Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", e, Config.instance));
  17. }
  18. try
  19. {
  20. config.Save(ConfigurationSaveMode.Modified);
  21. Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.advancedOperation, "Configuration " + key + " sauvée avec la valeur " + value, Config.instance));
  22. }
  23. catch (ConfigurationException cEEx)
  24. {
  25. Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", cEEx, Config.instance));
  26. return false;
  27. }
  28. return true;
  29. }


Que ce soit dans la base de registre ou manuellement dans le fichier de configuration, il nous incombe de transformer les valeurs en chaînes de caractères ou d’effectuer l’opération inverse, alors que dans le cas des liaisons cette tâche nous est épargnée.

Avatar :: Steph Un article de Steph

Source : www.microsoft.com


Sélection, tri et recherche d'articles
FILTRER :
TRIER :1er critère : 2e critère :
CHERCHER : Dans les titres Dans le contenu


[Afficher les liens en fonction des critères du formulaire ci-dessus]

English translation

You have asked to visit this site in English. For now, only the interface is translated, but not all the content yet.

If you want to help me in translations, your contribution is welcome. All you need to do is register on the site, and send me a message asking me to add you to the group of translators, which will give you the opportunity to translate the pages you want. A link at the bottom of each translated page indicates that you are the translator, and has a link to your profile.

Thank you in advance.

Document created the 13/09/2004, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/ast-rf-394.html

The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.