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]

Deutsche Übersetzung

Sie haben gebeten, diese Seite auf Deutsch zu besuchen. Momentan ist nur die Oberfläche übersetzt, aber noch nicht der gesamte Inhalt.

Wenn Sie mir bei Übersetzungen helfen wollen, ist Ihr Beitrag willkommen. Alles, was Sie tun müssen, ist, sich auf der Website zu registrieren und mir eine Nachricht zu schicken, in der Sie gebeten werden, Sie der Gruppe der Übersetzer hinzuzufügen, die Ihnen die Möglichkeit gibt, die gewünschten Seiten zu übersetzen. Ein Link am Ende jeder übersetzten Seite zeigt an, dass Sie der Übersetzer sind und einen Link zu Ihrem Profil haben.

Vielen Dank im Voraus.

Dokument erstellt 13/09/2004, zuletzt geändert 26/10/2018
Quelle des gedruckten Dokuments:https://www.gaudry.be/de/ast-rf-394.html

Die Infobro ist eine persönliche Seite, deren Inhalt in meiner alleinigen Verantwortung liegt. Der Text ist unter der CreativeCommons-Lizenz (BY-NC-SA) verfügbar. Weitere Informationen auf die Nutzungsbedingungen und dem Autor.