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
Nederlandse vertaling
U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.
Bij voorbaat dank.
Document heeft de 13/09/2004 gemaakt, de laatste keer de 26/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/ast-rf-394.html
De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.