web-dev-qa-db-fra.com

ConfigurationManager.AppSettings - Comment modifier et sauvegarder?

Cela peut sembler trop difficile à demander et je fais la même chose que celle suggérée dans les articles, mais cela ne fonctionne pas comme prévu. J'espère que quelqu'un pourra me diriger dans la bonne direction.

Je souhaite enregistrer les paramètres utilisateur par AppSettings.

Une fois le Winform fermé, je déclenche ceci:

conf.Configuration config = 
           ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null)
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
                                           e.Payload.IntegrateCheckBox.ToString();
else
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
                                          e.Payload.IntegrateCheckBox.ToString());

config.Save(ConfigurationSaveMode.Modified);

Ainsi, la première fois que l'entrée n'existe pas encore, il la créerait simplement, sinon cela modifierait l'entrée existante. Cependant cela ne sauve pas.

1) Qu'est-ce que je fais mal?

2) Où dois-je m'attendre à ce que les paramètres utilisateur pour les paramètres d'application soient à nouveau enregistrés? Est-ce dans le dossier Debug ou dans le dossier C:\Documents and Settings\NOM D'UTILISATEUR\Local Settings\Application Data?

68
Houman

Peut-être devriez-vous envisager d'ajouter un fichier de paramètres. (par exemple, App.Settings) La création de ce fichier vous permettra de procéder comme suit:

string mysetting = App.Default.MySetting;
App.Default.MySetting = "my new setting";

Cela signifie que vous pouvez modifier puis modifier des éléments, où ceux-ci sont fortement typés et, mieux encore ... vous n'avez pas besoin de toucher au format xml avant de déployer! 

Le résultat est un paramètre contextuel Application ou User.

Jetez un coup d’œil dans le menu «ajouter un nouvel élément» pour le fichier de paramètres.

20
Dann

Pour changer les valeurs dans la section appSettings de votre fichier app.config:

config.AppSettings.Settings.Remove(key);
config.AppSettings.Settings.Add(key, value);

fait le travail.

Bien sûr, la meilleure pratique est la classe Settings mais cela dépend de ce que vous recherchez.

64
Marek

Je sais que je suis en retard :) Mais voici comment je le fais:

public static void AddOrUpdateAppSettings(string key, string value)
{
    try
    {
        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name);
    }
    catch (ConfigurationErrorsException)
    {
        Console.WriteLine("Error writing app settings");
    }
}

Pour plus d'informations, consultez MSDN

54
Wahid Bitar

Préférez <appSettings> à <customUserSetting> section. Il est beaucoup plus facile de lire ET d’écrire avec ConfigurationManager (Web). ConfigurationSection, ConfigurationElement et ConfigurationElementCollection requièrent de dériver des classes personnalisées et d'implémenter les propriétés ConfigurationProperty personnalisées. Beaucoup trop pour les simples mortels de tous les jours, IMO.

Voici un exemple de lecture et d'écriture dans web.config:

using System.Web.Configuration;
using System.Configuration;

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
string oldValue = config.AppSettings.Settings["SomeKey"].Value;
config.AppSettings.Settings["SomeKey"].Value = "NewValue";
config.Save(ConfigurationSaveMode.Modified);

Avant:

<appSettings>
  <add key="SomeKey" value="oldValue" />
</appSettings>

Après:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
39
Tom Wilson

comme la question de base concerne les formes gagnantes, voici la solution:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value");
config.Save(ConfigurationSaveMode.Modified);

si la clé existe déjà:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
23
Omid S.
public void ApplySettings(string key, string value)
{

        var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
        var settings = configFile.AppSettings.Settings;
        if (settings[key] == null)
        {
            settings.Add(key, value);
        }
        else
        {
            settings[key].Value = value;
        }
        configFile.Save(ConfigurationSaveMode.Modified);
        ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
}
7
Kamil Ibadov

Essayez d'ajouter ceci après votre appel de sauvegarde.

ConfigurationManager.RefreshSection( "appSettings" );
7
Justin

N'oubliez pas que ConfigurationManager utilise un seul fichier app.config, un projet en démarrage.

Si vous mettez un fichier app.config dans une solution A et y faites référence à partir d'une autre solution B, si vous exécutez B, un fichier app.config de A sera ignoré.

Ainsi, par exemple, le projet de test unitaire doit avoir son propre app.config.

6
doubleloop

Je pense que le problème est que dans le studio de débogage, n'utilisez pas l'exeName normal.

il utilise indtead "NameApplication" .Host.exe

le nom du fichier de configuration est donc "NameApplication" .Host.exe.config et non "NameApplication" .exe.config

et après la fermeture de l'application - il retourne à l'arrière

ainsi, si vous vérifiez le mauvais fichier ou le mauvais moment, vous verrez que rien n'a changé.

2
chmouel kalifa

Vous pouvez le changer manuellement:

private void UpdateConfigFile(string appConfigPath, string key, string value)
{
     var appConfigContent = File.ReadAllText(appConfigPath);
     var searchedString = $"<add key=\"{key}\" value=\"";
     var index = appConfigContent.IndexOf(searchedString) + searchedString.Length;
     var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index);
     var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\"");
     File.WriteAllText(appConfigPath, newContent);
}
0
Unicorde