Это может показаться чересчур сложным, и я делаю то же самое, что и предлагаемое в статьях, но оно работает не так, как ожидалось. Надеюсь, кто-то может указать мне в правильном направлении.
Я хотел бы сохранить настройки пользователей в 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);
}