ConfigurationManager.AppSettings - Как изменить и сохранить?

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

Я хотел бы сохранить настройки пользователей в 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) Где я могу ожидать, что параметры настроек приложения для сохранения снова будут сохранены? Это находится в папке Debug или в папке C:\Documents and Settings\USERNAME\Local Settings\Application Data?

Ответ 1

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

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

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

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

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

Ответ 2

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

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

выполняет задание.

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

Ответ 3

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

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

Ответ 4

Предпочитает от <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>

Ответ 5

поскольку базовый вопрос о выигрышных формах здесь является решением: (Я только что изменил код 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);

Ответ 6

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

ConfigurationManager.RefreshSection( "appSettings" );

Ответ 7

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

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

Итак, например, проект unit test должен иметь свой собственный app.config.

Ответ 8

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

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

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

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

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

Ответ 9

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

Ответ 10

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

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