ConfigurationManager не сохраняет настройки

Вот код, который я использую:

private void SaveConfiguration()
{
    if (txtUsername.Text != "" && txtPassword.Text != "")
    {
        ConfigurationManager.AppSettings["Username"] = txtUsername.Text;
        ConfigurationManager.AppSettings["Password"] = txtPassword.Text;

        MessageBox.Show("Su configuracion guardo exitosamente.", "Exito!");
        this.Close();
    }
    else
    {
        MessageBox.Show("Por favor lleno los campos.", "Error.");
    }
}

Теперь настройки сохраняются, но когда я закрываю приложение и нажимаю F5 для его повторного запуска, значения возвращаются к тому, что вводится в файл app.config. Любые предложения?

Ответ 1

Я думаю, вам следует вызвать метод Save

ConfigurationManager.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

ИЗМЕНИТЬ

Для сохранения вам нужно использовать объект конфигурации, возвращаемый методом OpenExeConfiguration

//Create the object
Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

//make changes
config.AppSettings.Settings["Username"].Value = txtUsername.Text;
config.AppSettings.Settings["Password"].Value = txtPassword.Text;

//save to apply changes
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

Другие ссылки здесь ConfigurationManager Class

Ответ 2

Когда вы запускаете приложение с помощью F5,

  • ваш код скомпилирован,
  • исполняемый файл копируется в подкаталог bin или bin\Debug каталога исходного кода,
  • ваш app.config скопирован как yourexecutable.exe.config в этот каталог и
  • ваш исполняемый файл запускается в этом каталоге.

Таким образом, ваше приложение использует yourexecutable.exe.config в каталоге bin или bin\Debug, и именно там ConfigurationManager сохраняет изменения, а не в вашем каталоге исходного кода. Это не будет проблемой после развертывания вашего приложения, потому что тогда изменения перейдут в yourexecutable.exe.config в каталоге развертывания, что вам и нужно.

Ответ 3

В дополнение к комментарию Appetere о втором ответе:

Также обратите внимание, что если вы отлаживаете (и не отключили процесс vshost), то, когда ваше приложение останавливается, yourexecutable.vshost.exe.config снова будет заменен на yourexecutable.exe.config.

Итак, вы еще не видите никаких изменений, которые вы сделали после этого! (Если вы остановитесь на точке останова во время отладки и просмотрите файл после внесения изменений и вызвав раздел обновления, вы увидите свои изменения).

Это очень сбивает с толку, если вы отлаживаете программу, которая ищет параметр и, если не присутствует, записывает его. Даже если вас предупреждают о том, что установка будет там во второй раз, когда вы запустите программу, можно ожидать, что она будет там ПОСЛЕ первого запуска программы и ПЕРЕД вторым запуском... alas!

Не о чем беспокоиться, поскольку все это просто работает, когда приложение развертывается или запускается непосредственно из bin, как уже указывали другие...

Но можно попасть в "ловушку", хотя если вы отлаживаете свою программу и решаете использовать настройки приложения в первый раз, и, чтобы избежать ручной записи XML, вы решили, что начнете с кода и получите программа, чтобы написать настройку... чтобы получить все это, тогда, возможно, добавьте еще несколько.