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
Article publié le 12/03/2007 13:21:32Quand 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.
Code c# (4 lignes)
private void Form1_FormClosing(object sender, FormClosingEventArgs e) { Properties.Settings.Default.Save(); }
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.
Code c# (31 lignes)
private void Form1_Load(object sender, EventArgs e) { RegistryKey rkcu = Registry.CurrentUser; RegistryKey rk = rkcu.OpenSubKey(@"Software\Eyrolles\Leblanc\Config\Registry", true); if (rk != null) { int W, H, X, Y; try { X = Convert.ToInt32(rk.GetValue("X")); Y = Convert.ToInt32(rk.GetValue("Y")); W = Convert.ToInt32(rk.GetValue("W")); H = Convert.ToInt32(rk.GetValue("H")); this.StartPosition = FormStartPosition.Manual; } catch (Exception) { } } } private void Form1_FormClosed(object sender, FormClosedEventArgs e) { RegistryKey rkcu = Registry.CurrentUser; RegistryKey rk = rkcu.CreateSubKey(@"Software\Eyrolles\Leblanc\Config\Registry"); rk.SetValue("X", this.Location.X); rk.SetValue("Y", this.Location.Y); rk.SetValue("W", this.Width); rk.SetValue("H", this.Height); rk.Flush(); rk.Close(); }
Pour ma part, j’ai préféré utiliser le fichier de configuration
Code c# (16 lignes)
private void MainForm_Load(object sender, EventArgs e) { try { WindowState = (FormWindowState)Enum.Parse( ConfigurationManager.AppSettings["mainFormState"] ); } catch (Exception) { WindowState = FormWindowState.Normal; } } private void MainForm_FormClosing(object sender, FormClosingEventArgs e) { }
Et voici la méthode statique que j'utilise dans la classe Config :
Code c# (29 lignes)
public static bool saveAppSetting(String key, String value) { String exePath = System.IO.Path.Combine(Environment.CurrentDirectory, "BiblioBrol.exe"); Configuration config = ConfigurationManager.OpenExeConfiguration(exePath); try { config.AppSettings.Settings[key].Value = value; ConfigurationManager.AppSettings[key] = value; } catch (NullReferenceException nre) { 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)); } catch (Exception e) { Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", e, Config.instance)); } try { config.Save(ConfigurationSaveMode.Modified); Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.advancedOperation, "Configuration " + key + " sauvée avec la valeur " + value, Config.instance)); } catch (ConfigurationException cEEx) { Config.Instance.notify(new Observer.Notification(Observer.Notification.VERBOSE.error, "Sauvegarde d'une valeur de configuration", cEEx, Config.instance)); return false; } return true; }
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.
Un article de Steph
Source : www.microsoft.com
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.