2010-11-18 22 views
13

Aquí está el código que estoy usando:ConfigurationManager no guarda la configuración

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

Ahora, los ajustes se conservan, pero cuando cierro la aplicación y presione F5 para ejecutarlo de nuevo, los valores se volvieron a lo que se escribe en el archivo app.config. ¿Alguna sugerencia?

+3

probablemente debería pensar en utilizar string.IsNullOrEmpty (...) en lugar de comparar con "" :) –

Respuesta

45

creo que se debe llamar al método Save

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

EDITAR

Para poder ahorrar usted tiene que utilizar un objeto de configuración devuelta por el OpenExeConfiguration Método

//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"); 

Más referencias aquí ConfigurationManager Class

+8

No hay método .Save(). –

+2

Para que esto funcione tuve que usar este config.AppSettings.Settings ["Username"]. Value = txtUsername.Text; config.AppSettings.Settings ["Password"]. Value = txtPassword.Text; – Martin

+1

Su última línea de código es incorrecta. Debe ser ConfigurationManager.RefreshSection(). La clase de configuración no tiene un método RefreshSection. –

27

Al ejecutar la aplicación con F5,

  • su código se compila,
  • el ejecutable se copia en el bin o bin\Debug subdirectorio del directorio de código fuente,
  • su app.config se copia como yourexecutable.exe.config en ese directorio, y
  • su ejecutable se inicia en ese directorio.

Por lo tanto, la aplicación utiliza el yourexecutable.exe.config en el directorio bin o bin\Debug, y es allí que ConfigurationManager guarda los cambios, no en el directorio de código fuente. Esto no será un problema después de implementar su aplicación, porque entonces, los cambios irán al yourexecutable.exe.config en el directorio de implementación, que es lo que desea.

+0

Gracias, muy buena explicación. –

+2

Y si está ejecutando en modo de depuración, será yourexecutable.vshost.exe.config – Appetere

+0

¡Gran explicación! Desde ayer, me he estado preguntando por qué las configuraciones no se guardan en el archivo App.config original hasta que leo esto. ¡Gracias! –

0

En relación con el comentario de Appetere en la segunda respuesta:

También tenga en cuenta que si se va a depurar (y no haya desactivado el proceso vshost), a continuación, cuando su aplicación se detiene, lo hará yourexecutable.vshost.exe.config ser reemplazado con yourexecutable.exe.config nuevamente.

¡De nuevo, es posible que no vea los cambios que realizó después! (Si se detiene en un punto de interrupción mientras depura y busca en el archivo después de hacer su modificación y llamar a la sección de actualización, verá los cambios).

Esto es muy confuso si está depurando un programa que busca una configuración y, si no está presente, la escribe. Incluso si se le advierte que no espere que la configuración esté allí la segunda vez que ejecute el programa, se podría esperar que esté allí DESPUÉS de la primera ejecución del programa y ANTES de la segunda ejecución ... ¡ay!

No es nada de qué preocuparse ya que todo funciona cuando la aplicación se implementa o iniciar directamente desde bin como ya se ha indicado ...

Pero es posible caer en una 'trampa' aunque si' vuelva a depurar su programa y decida usar la Configuración de la aplicación por primera vez, y para evitar escribir a mano el XML, usted decide que comenzará desde el código y hacer que el programa escriba una configuración ... para obtener todo eso, entonces tal vez agregue varios más.

Cuestiones relacionadas