2010-11-18 3 views
13

Вот код, я использую: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. Какие-либо предложения?

+3

Возможно, вам стоит подумать об использовании string.IsNullOrEmpty (...) вместо сравнения с "" :) –

ответ

45

Я думаю, вы должны вызвать метод сохранения

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

EDIT

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

//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

+8

Не существует метода .Save(). – 2010-11-18 16:01:42

+2

Чтобы получить эту работу, мне пришлось использовать этот файл config.AppSettings.Settings ["Username"]. Значение = txtUsername.Text; config.AppSettings.Settings ["Password"]. Значение = txtPassword.Text; – Martin

+1

Ваша последняя строка кода неверна. Это должен быть ConfigurationManager.RefreshSection(). У класса конфигурации нет метода RefreshSection. –

27

При запуске приложения с F5,

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

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

+0

Спасибо, очень приятное объяснение. – 2010-11-18 16:05:37

+2

И если вы работаете в режиме отладки, это будет yourexecutable.vshost.exe.config – Appetere

+0

Отличное объяснение! Со вчерашнего дня мне стало интересно, почему конфиги не сохранены в исходном файле App.config, пока я не прочитаю это. Благодаря! –

0

Далее на комментарий Appetere на второй ответ:

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

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

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

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

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

Смежные вопросы