2010-11-18 10 views
13

Oto kod używam:ConfigurationManager nie zapisuje ustawień

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

Teraz, ustawienia są zachowywane, ale kiedy zamknąć aplikację i naciśnij klawisz F5, aby uruchomić go ponownie, wartości są przywrócone do co jest wpisane w pliku app.config. Jakieś sugestie?

+3

prawdopodobnie powinieneś pomyśleć o użyciu string.IsNullOrEmpty (...) zamiast porównywania z "" :) :) –

Odpowiedz

45

myślę, że należy wywołać metodę Zapisz

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

EDIT

aby móc zapisać trzeba użyć obiektu konfiguracji zwracana przez metodę 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"); 

Więcej referencji tutaj ConfigurationManager Class

+8

Nie ma metody .Save(). –

+2

Aby to działało, musiałem użyć tego config.AppSettings.Settings ["Username"]. Value = txtUsername.Text; config.AppSettings.Settings ["Password"]. Wartość = txtPassword.Text; – Martin

+1

Twoja ostatnia linia kodu jest niepoprawna. Powinien to być ConfigurationManager.RefreshSection(). Klasa konfiguracji nie posiada metody RefreshSection. –

27

Po uruchomieniu aplikacji z F5,

  • kod jest kompilowany,
  • wykonywalny jest kopiowany do podkatalogu katalogu kodu źródłowego bin lub bin\Debug,
  • swój app.config jest kopiowany jako yourexecutable.exe.config w ten katalog i
  • twój plik wykonywalny zostanie uruchomiony w tym katalogu.

Zatem, aplikacja wykorzystuje yourexecutable.exe.config w katalogu bin lub bin\Debug i jest tam że ConfigurationManager zapisuje zmiany, a nie w katalogu z kodem źródłowym. Nie będzie to problemem po wdrożeniu aplikacji, ponieważ wtedy zmiany przejdą do yourexecutable.exe.config w katalogu wdrażania, który jest tym, czego potrzebujesz.

+0

Dzięki, bardzo ładne wyjaśnienie. –

+2

A jeśli używasz trybu debugowania, będzie to yourexecutable.vshost.exe.config – Appetere

+0

Świetne wyjaśnienie! Od wczoraj zastanawiałem się, dlaczego konfiguracje nie są zapisywane w oryginalnym pliku App.config, dopóki tego nie przeczytam. Dzięki! –

0

nawiązaniu do komentarza Appetere w sprawie drugiego odpowiedzi:

Należy również zauważyć, że jeśli debugowania (i nie wyłączył proces vshost), a następnie, gdy aplikacja przestaje, yourexecutable.vshost.exe.config będzie zostać zastąpione ponownie przez yourexecutable.exe.config.

Po raz kolejny możesz nie widzieć żadnych zmian, które wprowadziłeś później! (Jeśli zatrzymasz się w punkcie przerwania podczas debugowania i zajrzysz do pliku po wykonaniu modyfikacji i sekcji odświeżania połączenia, zobaczysz swoje zmiany).

Jest to bardzo mylące, jeśli debugujesz program, który szuka ustawienia, a jeśli nie jest obecny, zapisuje go. Nawet jeśli jesteś uprzedzony, że nie spodziewasz się, że ustawienie będzie tam po raz drugi, możesz spodziewać się, że będzie ono obecne po pierwszym uruchomieniu programu i PRZED drugim uruchomieniem ... niestety!

To nic martwić, ponieważ wszystko po prostu działa, gdy aplikacja jest wdrażany lub uruchamiane bezpośrednio z pojemnika, jak inni już wspomniano ...

Ale to jest możliwe, aby wpaść w „pułapkę”, ale jeśli” ponownie debugujesz swój program i decydujesz się na używanie ustawień aplikacji po raz pierwszy, i aby uniknąć ręcznego pisania XML, decydujesz, że zaczniesz od kodu i otrzymasz program do napisania ustawienia ... aby uzyskać wszystkie te rzeczy, to może dodaj jeszcze kilka.

Powiązane problemy