Диспетчер конфигураций.AppSettings-как изменить и сохранить?
это может показаться слишком тривиальным, чтобы спросить, и я делаю то же самое, что и в статьях, но это не работает так, как ожидалось. Надеюсь, кто-то может указать мне правильное направление.
Я хотел бы сохранить usersettings в 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) где я ожидаю, что usersettings для настроек приложения будут сохранены снова? Это в папке отладки или в C:Documents и настройкиимя пользователялокальные настройкипапка данных приложения?
10 ответов:
Возможно, вам стоит посмотреть на добавление файла настроек. (например, приложение.Настройки) Создание этого файла позволит вам сделать следующее:
string mysetting = App.Default.MySetting; App.Default.MySetting = "my new setting";
это означает, что вы можете редактировать и затем изменять элементы, где элементы строго типизированы, и лучше всего... вам не нужно прикасаться к xml перед развертыванием!
результатом является контекстная настройка приложения или пользователя.
посмотрите в меню "Добавить новый элемент" для файла настроек.
о том, как изменить значения в разделе appsettings в вашем приложении.конфигурационный файл:
config.AppSettings.Settings.Remove(key); config.AppSettings.Settings.Add(key, value);
делает работу.
конечно, лучшая практика-это класс настроек, но это зависит от того, что вам нужно.
Я знаю, что опаздываю :) но вот как я это делаю:
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
предпочитаю
<appSettings>
до . Гораздо проще читать и писать с помощью (Web)ConfigurationManager. ConfigurationSection, ConfigurationElement и ConfigurationElementCollection требуют, чтобы вы производили пользовательские классы и реализовывали пользовательские свойства ConfigurationProperty. Слишком много для простых смертных ИМО.вот пример чтения и записи в интернете.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>
как базовый вопрос о формах win вот решение : ( Я только что изменил код с помощью user1032413 на rflect windowsForms settings ) если это новый ключ :
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 использует только одно приложение.config - тот, который находится в стартовом проекте.
Если вы положили некоторые приложения.сконфигурируйте решение A и сделайте ссылку на него из другого решения B, а затем, если вы запустите B, приложение.конфиг от A будет проигнорирован.
Так, например, модульный тестовый проект должен иметь свое собственное приложение.конфиг.
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); }
Я думаю, что проблема в том, что в отладке visual studio не используют обычное имя exeName.
Он использует indtead "NameApplication".хозяин.exe
таким образом, имя файла конфигурации - "NameApplication".хозяин.исполняемый.конфиг и нет "NameApplication".исполняемый.конфигурации
и после закрытия приложения-он возвращается в заднее приложение.конфигурации
Так что если вы установите не тот файл или вы проверяете на то время вы увидите, что ничего не изменилось.
вы можете изменить его вручную:
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); }