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?

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

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

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

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

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

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

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

    делает работу.

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

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

     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

    Предпочитаете в . Гораздо проще читать и писать с (Web) ConfigurationManager. ConfigurationSection, ConfigurationElement и ConfigurationElementCollection требуют от вас создания пользовательских classов и реализации пользовательских свойств 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); 

    До:

        

    После:

        

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

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

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

     ConfigurationManager.RefreshSection( "appSettings" ); 

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

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

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

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

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

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

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

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

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

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

     private void UpdateConfigFile(string appConfigPath, string key, string value) { var appConfigContent = File.ReadAllText(appConfigPath); var searchedString = $" 
    Давайте будем гением компьютера.