Диспетчер конфигураций.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);
}