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

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