2010-11-18 9 views
13

Voici le code que je utilise:ConfigurationManager ne sauvegarde pas les paramètres

private void SaveConfiguration() 
{ 
    if (txtUsername.Text != "" && txtPassword.Text != "") 
    { 
     ConfigurationManager.AppSettings["Username"] = txtUsername.Text; 
     ConfigurationManager.AppSettings["Password"] = txtPassword.Text; 

     MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!"); 
     this.Close(); 
    } 
    else 
    { 
     MessageBox.Show("Por favor lleno los campos.", "Error."); 
    } 
} 

Maintenant, les paramètres sont conservés mais quand je ferme l'application et appuyez sur F5 pour l'exécuter à nouveau, les valeurs sont Reconvertit à ce qui est tapé dans le fichier app.config. Aucune suggestion?

+3

Vous devriez probablement penser à utiliser string.IsNullOrEmpty (...) au lieu de comparer à "" :) –

Répondre

45

Je pense que vous devez appeler la méthode Save

ConfigurationManager.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection("appSettings"); 

EDIT

Pour être en mesure de vous sauver devez utiliser un objet de configuration renvoyée par la méthode OpenExeConfiguration

//Create the object 
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

//make changes 
config.AppSettings.Settings["Username"].Value = txtUsername.Text; 
config.AppSettings.Settings["Password"].Value = txtPassword.Text; 

//save to apply changes 
config.Save(ConfigurationSaveMode.Modified); 
ConfigurationManager.RefreshSection("appSettings"); 

Plus de références ici ConfigurationManager Class

+8

Il n'y a pas de méthode .Save(). –

+2

Pour que cela fonctionne, j'ai dû utiliser ce config.AppSettings.Settings ["Username"]. Value = txtUsername.Text; config.AppSettings.Settings ["Mot de passe"]. Value = txtPassword.Text; – Martin

+1

Votre dernière ligne de code est incorrecte. Ce devrait être ConfigurationManager.RefreshSection(). La classe de configuration n'a pas de méthode RefreshSection. –

27

Lorsque vous exécutez votre application avec F5,

  • votre code est compilé,
  • l'exécutable est copié dans le bin ou bin\Debug sous-répertoire de votre répertoire de code source,
  • votre app.config est copié comme yourexecutable.exe.config en ce répertoire, et
  • votre fichier exécutable est démarré dans ce répertoire.

Ainsi, votre application utilise le yourexecutable.exe.config dans le répertoire bin ou bin\Debug, et il est il que ConfigurationManager enregistre les modifications, pas dans votre répertoire de code source. Ce ne sera pas un problème après le déploiement de votre application, car alors, les modifications iront à yourexecutable.exe.config dans le répertoire de déploiement, ce qui est ce que vous voulez.

+0

Merci, très belle explication. –

+2

Et si vous utilisez le mode debug, ce sera votreexecutable.vshost.exe.config – Appetere

+0

Bonne explication! Depuis hier, je me demandais pourquoi les configs ne sont pas sauvegardés dans le fichier App.config original jusqu'à ce que je lise ceci. Merci! –

0

De plus au commentaire de Appetere sur la deuxième réponse:

Notez également que si vous le débogage (et ne pas avoir désactivé le processus de vshost), puis lors de l'arrêt de votre application, yourexecutable.vshost.exe.config sera être à nouveau remplacé par yourexecutable.exe.config.

Encore une fois, vous ne verrez peut-être aucun changement par la suite! (Si vous arrêtez à un point d'arrêt pendant le débogage et que vous regardez dans le fichier après avoir modifié votre section de rafraîchissement, vous verrez vos changements).

Ceci est très déroutant si vous déboguez un programme qui recherche un paramètre et, s'il n'est pas présent, l'écrit. Même si vous êtes prévenu de ne pas vous attendre à ce que le réglage soit là la deuxième fois que vous lancez le programme, on peut s'attendre à ce qu'il soit là APRÈS la première manche du programme et AVANT la deuxième manche ... hélas!

Il n'y a rien à se soucier puisque tout fonctionne lorsque l'application est déployée ou démarré directement à partir de bin comme d'autres l'ont déjà dit ...

Mais il est possible de tomber dans un « piège » que si vous re déboguer votre programme et décider d'utiliser les paramètres d'application pour la première fois, et pour éviter d'écrire manuellement le code XML, vous décidez que vous commencerez à partir du code et que le programme écrira un paramètre ... pour obtenir tout ça, alors peut-être ajouter plusieurs autres.