Диспетчер конфигураций.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 для настроек приложения будут сохранены снова? Это в папке Debug или в C:Documents и настройкиимя пользователялокальные настройкипапка данных приложения?
10 ответов
Возможно, вам стоит посмотреть на добавление файла настроек. (например, App.Настройки) Создание этого файла позволит вам сделать следующее:
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>
to . Гораздо проще читать и писать с помощью (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 на настройки windowsForms rflect ) если это новый ключ :
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, app.конфигурация из 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".хозяин.исполняемый.config и не "NameApplication".исполняемый.config
и после закрытия приложения-он возвращается в заднее приложение.config
поэтому, если вы проверите неправильный файл или проверите неправильное время, вы увидите, что ничего не изменилось.
вы можете изменить его вручную:
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);
}