2011-03-11 15 views
60

Potrebbe sembrare troppo trival per chiedere e faccio la stessa cosa suggerita negli articoli, ma non funziona come previsto. Spero che qualcuno possa indicarmi la giusta direzione.ConfigurationManager.AppSettings - Come modificare e salvare?

Vorrei salvare le impostazioni degli utenti per AppSettings.

Una volta che il Winform è chiusa I innescare questo:

conf.Configuration config = 
      ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 

if (ConfigurationManager.AppSettings["IntegrateWithPerforce"] != null) 
    ConfigurationManager.AppSettings["IntegrateWithPerforce"] = 
              e.Payload.IntegrateCheckBox.ToString(); 
else 
    config.AppSettings.Settings.Add("IntegrateWithPerforce", 
              e.Payload.IntegrateCheckBox.ToString()); 

config.Save(ConfigurationSaveMode.Modified); 

Così la prima volta in cui il doesnt ingresso esiste ancora, sarebbe semplicemente crearla, altrimenti sarebbe modificare la voce esistente. Tuttavia questo non salva.

1) Che cosa sto facendo male?

2) Dove mi aspetto che le impostazioni utente per le impostazioni dell'app vengano salvate di nuovo? Si trova nella cartella Debug o in C: \ Documents and Settings \ USERNAME \ Impostazioni locali \ cartella Dati applicazioni?

+1

possibile duplicato di [Best practice per salvare le impostazioni delle applicazioni in un'applicazione Windows] (http://stackoverflow.com/questions/453161/best-practice -di-salvare-applicazione-impostazioni-in-un'applicazione-windows) – Richard

+0

Fare riferimento a questo: http://stackoverflow.com/questions/453161/best-practice-to-save-application-settings-in-a-windows -application – Kumar

+0

In realtà non volevo usare Settings.settings come suggerito lì. Ma ora penso che il modo in cui lo uso, dopo tutto, non è il corretto aproach, dal momento che salva i valori come Impostazioni dell'applicazione piuttosto che le impostazioni utente ... – Houman

risposta

15

Forse dovresti cercare di aggiungere un file di impostazioni. (Ad es App.Settings) Creazione di questo file vi permetterà di effettuare le seguenti operazioni:

string mysetting = App.Default.MySetting; 
App.Default.MySetting = "my new setting"; 

Questo significa che è possibile modificare e quindi modificare gli elementi, in cui gli elementi sono fortemente tipizzati, e meglio di tutti ... voi non è necessario toccare alcun xml prima della distribuzione!

Il risultato è un'impostazione contestuale Applicazione o Utente.

Dai un'occhiata al menu "aggiungi nuovo elemento" per il file delle impostazioni.

+1

Aggiunta di un file Settings.Settings o utilizzando quello esistente in Proprietà/Impostazioni.settings è la stessa cosa giusta ? In caso di utilizzo di exsiting, vorrei fare qualcosa di simile: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save(); – Houman

+0

Molto probabilmente. Ho sempre usato solo file separati come quello che mi ha fatto bene.Se questo è il caso, ho appena imparato qualcosa – Dann

7

Provare ad aggiungere questo dopo la chiamata di salvataggio.

ConfigurationManager.RefreshSection("appSettings"); 
+0

Questo è particolarmente importante se stai scrivendo quindi leggendo la stessa app Impostazione in rapida successione. – Trevor

57

su come modificare i valori nella sezione appSettings nel file app.config:

config.AppSettings.Settings.Remove(key); 
config.AppSettings.Settings.Add(key, value); 

fa il lavoro.

Ovviamente le migliori pratiche sono le Impostazioni di classe ma dipende da cosa state cercando.

+3

Dopo aver esaminato tre idee di modifica di AppSettings kajillion qui e all'estero, questo è il più semplice/migliore e (fondamentale) funziona anche se l'utente distrugge il nodo downwitch

36

Preferire <appSettings> a <customUserSetting> sezione. È molto più facile leggere e scrivere con (Web) ConfigurationManager. ConfigurationSection, ConfigurationElement e ConfigurationElementCollection richiedono di derivare classi personalizzate e implementare proprietà ConfigurationProperty personalizzate. Troppo per semplici mortali di tutti i giorni. IMO.

Ecco un esempio di lettura e scrittura a web.config:

using System.Web.Configuration; 
using System.Configuration; 

Configuration config = WebConfigurationManager.OpenWebConfiguration("/"); 
string oldValue = config.AppSettings.Settings["SomeKey"].Value; 
config.AppSettings.Settings["SomeKey"].Value = "NewValue"; 
config.Save(ConfigurationSaveMode.Modified); 

Prima:

<appSettings> 
    <add key="SomeKey" value="oldValue" /> 
</appSettings> 

Dopo:

<appSettings> 
    <add key="SomeKey" value="newValue" /> 
</appSettings> 
6

Ricordate che ConfigurationManager utilizza una sola applicazione. config - uno che è nel progetto di avvio.

Se si inserisce qualche app.config a una soluzione A e fare riferimento ad essa da un'altra soluzione B, quindi se si esegue B, app.config da A verrà ignorato.

Ad esempio, il progetto di test dell'unità dovrebbe avere il proprio app.config.

21

come la questione di base è di circa forme vincere qui è la soluzione: (Ho appena cambiato il codice da user1032413 per rflect impostazioni WindowsForms) se si tratta di una nuova chiave:

Configuration config = configurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings.Add("Key","Value"); 
config.Save(ConfigurationSaveMode.Modified); 

se la chiave esiste già :

Configuration config = ConfigurationManager.OpenExeConfiguration(Application.ExecutablePath); 
config.AppSettings.Settings["Key"].Value="Value"; 
config.Save(ConfigurationSaveMode.Modified); 
43

lo so, sono in ritardo :) Ma questo come lo faccio:

public static void AddOrUpdateAppSettings(string key, string value) 
{ 
    try 
    { 
     var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     var settings = configFile.AppSettings.Settings; 
     if (settings[key] == null) 
     { 
      settings.Add(key, value); 
     } 
     else 
     { 
      settings[key].Value = value; 
     } 
     configFile.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
    } 
    catch (ConfigurationErrorsException) 
    { 
     Console.WriteLine("Error writing app settings"); 
    } 
} 

Per ulteriori informazioni: MSDN

+0

Un punto importante da notare con quanto sopra è che se si sta eseguendo questo da il debugger (all'interno di Visual Studio) quindi il file app.config verrà sovrascritto ogni volta che si crea. Il modo migliore per testare questo è creare l'applicazione, quindi navigare nella directory di output e avviare il file eseguibile da lì. --- da http://vbcity.com/forums/t/152772.aspx –

2

Penso che il problema sia che nello studio di debug non si usi il normale exeName.

esso uso indtead "NameApplication" .host.exe

così il nome del file di configurazione è .host.exe.config "NameApplication" e non "NameApplication" exe.config

e dopo l'applicazione chiudi - ritorna al retro app.config

quindi se si controlla il file sbagliato o si verifica l'ora sbagliata si vedrà che nulla è cambiato.

3
public void ApplySettings(string key, string value) 
{ 

     var configFile = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
     var settings = configFile.AppSettings.Settings; 
     if (settings[key] == null) 
     { 
      settings.Add(key, value); 
     } 
     else 
     { 
      settings[key].Value = value; 
     } 
     configFile.Save(ConfigurationSaveMode.Modified); 
     ConfigurationManager.RefreshSection(configFile.AppSettings.SectionInformation.Name); 
} 
0

È possibile modificare manualmente:

private void UpdateConfigFile(string appConfigPath, string key, string value) 
{ 
    var appConfigContent = File.ReadAllText(appConfigPath); 
    var searchedString = $"<add key=\"{key}\" value=\""; 
    var index = appConfigContent.IndexOf(searchedString) + searchedString.Length; 
    var currentValue = appConfigContent.Substring(index, appConfigContent.IndexOf("\"", index) - index); 
    var newContent = appConfigContent.Replace($"{searchedString}{currentValue}\"", $"{searchedString}{newValue}\""); 
    File.WriteAllText(appConfigPath, newContent); 
} 
Problemi correlati