2010-11-18 16 views
13

Ecco il codice che sto utilizzando:ConfigurationManager non salva le impostazioni

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

Ora, le impostazioni vengono mantenute, ma quando chiudo l'applicazione e premere il tasto F5 per eseguire nuovamente, i valori sono ritornati al cosa viene digitato nel file app.config. Eventuali suggerimenti?

+3

probabilmente dovresti pensare a utilizzare string.IsNullOrEmpty (...) invece di confrontare "" :) –

risposta

45

penso che si dovrebbe chiamare il metodo Save

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

EDIT

Per essere in grado di risparmiare è necessario utilizzare un oggetto di configurazione restituito dal metodo 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"); 

Altri riferimenti qui ConfigurationManager Class

+8

Non esiste alcun metodo .Save(). –

+2

Per funzionare, ho dovuto usare questo config.AppSettings.Settings ["Nome utente"]. Value = txtUsername.Text; config.AppSettings.Settings ["Password"]. Value = txtPassword.Text; – Martin

+1

L'ultima riga di codice non è corretta. Dovrebbe essere ConfigurationManager.RefreshSection(). La classe di configurazione non ha un metodo RefreshSection. –

27

Quando si esegue l'applicazione con F5,

  • il codice viene compilato,
  • l'eseguibile viene copiato nella bin o bin\Debug sottodirectory della directory del codice sorgente,
  • tua app.config viene copiato come yourexecutable.exe.config in quella directory e
  • il file eseguibile viene avviato in tale directory.

Così, l'applicazione utilizza la yourexecutable.exe.config nella directory bin o bin\Debug, ed è lì che ConfigurationManager salva le modifiche, non è nella directory di codice sorgente. Questo non sarà un problema dopo la distribuzione dell'applicazione, perché, quindi, le modifiche andranno a yourexecutable.exe.config nella directory di distribuzione, che è ciò che desideri.

+0

Grazie, molto bella spiegazione. –

+2

E se stai correndo in modalità debug, sarà yourexecutable.vshost.exe.config – Appetere

+0

Ottima spiegazione! Da ieri mi sono chiesto perché le configurazioni non vengano salvate nel file App.config originale finché non ho letto questo. Grazie! –

0

seguito al commento di Appetere sulla seconda risposta:

Si noti inoltre che se si sta debug (e non hanno disattivato il processo di vshost), poi quando l'applicazione si ferma, sarà yourexecutable.vshost.exe.config essere sostituito nuovamente con yourexecutable.exe.config.

Quindi, ancora una volta, non è possibile vedere eventuali modifiche apportate in seguito! (Se ti fermi a un punto di interruzione mentre esegui il debug e guardi nel file dopo aver effettuato la modifica e la sezione di aggiornamento delle chiamate, vedrai le tue modifiche).

Questo è molto confuso se si esegue il debug di un programma che cerca un'impostazione e, se non presente, lo scrive. Anche se sei avvisato di non aspettarti che l'impostazione sia lì la seconda volta che esegui il programma, ci si potrebbe aspettare che sia lì DOPO la prima esecuzione del programma e PRIMA della seconda esecuzione ... ahimè!

E 'nulla di cui preoccuparsi dal momento che tutto funziona solo quando l'applicazione viene distribuita o avviato direttamente dal bidone come altri hanno già detto ...

Ma è possibile cadere in una 'trappola' anche se' ri-debug il tuo programma e decidi di usare le Impostazioni Applicazione per la prima volta, e per evitare di scrivere a mano l'XML decidi di iniziare dal codice e ottenere il programma per scrivere un'impostazione ... per ottenere tutte quelle cose, quindi forse aggiungere molti altri.

Problemi correlati