ConfigurationManager.AppSettings - Как изменить и сохранить? - PullRequest
70 голосов
/ 11 марта 2011

Это может звучать слишком тривиально, чтобы спрашивать, и я делаю то же самое, что предложено в статьях, но это не работает, как ожидалось.Надеюсь, что кто-то может указать мне правильное направление.

Я хотел бы сохранить настройки пользователя для AppSettings.

После закрытия Winform я запускаю это:

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);

Таким образом, в первый раз, когда запись еще не существует, она просто создаст ее, в противном случае она изменит существующую запись.Однако это не спасает.

1) Что я делаю не так?

2) Где я ожидаю, что настройки пользователя для настроек приложения будут сохранены снова?Он находится в папке «Отладка» или в папке C: \ Documents and Settings \ ИМЯ ПОЛЬЗОВАТЕЛЯ \ Локальные настройки \ Папка с данными приложения?

Ответы [ 10 ]

65 голосов
/ 29 ноября 2011

Как изменить значения в разделе appSettings в файле app.config:

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

выполняет свою работу.

Конечно, лучше применять класс настроек, но это зависит от того, чтоВы после.

56 голосов
/ 06 ноября 2014

Я знаю, что опоздал :) Но вот как я это делаю:

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");
    }
}

Для получения дополнительной информации смотрите MSDN

39 голосов
/ 12 апреля 2012

Предпочтение от <appSettings> до <customUserSetting> секции.Гораздо проще читать и писать с (Web) ConfigurationManager.ConfigurationSection, ConfigurationElement и ConfigurationElementCollection требуют от вас создания пользовательских классов и реализации пользовательских свойств ConfigurationProperty.Слишком много для простых повседневных смертных ИМО.

Вот пример чтения и записи в 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);

До:

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

После:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
23 голосов
/ 25 декабря 2013

, поскольку базовый вопрос о формах выигрыша, вот решение: (я только что изменил код user1032413, чтобы изменить настройки windowsForms), если это новый ключ:

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

, если ключ уже существует:

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value";
config.Save(ConfigurationSaveMode.Modified);
22 голосов
/ 11 марта 2011

Возможно, вам стоит взглянуть на добавление файла настроек.(например, App.Settings) Создание этого файла позволит вам сделать следующее:

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

Это означает, что вы можете редактировать, а затем изменять элементы, где элементы строго типизированы, а лучше всего ...Вам не нужно прикасаться к любому xml перед развертыванием!

Результатом является контекстная настройка приложения или пользователя.

Просмотрите файл «Добавить новый элемент» для файла настроек.

9 голосов
/ 16 января 2017
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 голосов
/ 11 марта 2011

Попробуйте добавить это после сохранения.

ConfigurationManager.RefreshSection( "appSettings" );
6 голосов
/ 15 декабря 2012

Помните, что ConfigurationManager использует только один app.config - тот, который находится в стартовом проекте.

Если вы поместите некоторый файл app.config в решение A и сделаете ссылку на него из другого решения B, то если вы запустите B, app.config из A будет игнорироваться.

Так, например, проект модульного теста должен иметь свой собственный app.config.

2 голосов
/ 18 августа 2015

Я думаю, что проблема в том, что в отладочной визуальной студии не используют обычное exeName.

он использует indtead "NameApplication" .host.exe

поэтому имя файла конфигурации - «NameApplication» .host.exe.config, а не "NameApplication" .exe.config

и после закрытия приложения - оно возвращается в конец app.config

, поэтому, если вы проверите неправильный файл или не вовремя, вы увидите, что ничего не изменилось.

0 голосов
/ 27 августа 2017

Вы можете изменить его вручную:

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);
}
...