ConfigurationManager.AppSettings - Wie ändere und speichere ich?

81

Es klingt vielleicht zu trivial, um danach zu fragen, und ich mache das Gleiche wie in Artikeln vorgeschlagen, aber es funktioniert nicht wie erwartet. Hoffe jemand kann mich in die richtige Richtung weisen.

Ich möchte die Benutzereinstellungen pro AppSettings speichern.

Sobald die Winform geschlossen ist, löse ich Folgendes aus:

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

Wenn der Eintrag also zum ersten Mal noch nicht vorhanden ist, wird er einfach erstellt, andernfalls wird der vorhandene Eintrag geändert. Dies spart jedoch nicht.

1) Was mache ich falsch?

2) Wo erwarte ich, dass die Benutzereinstellungen für App-Einstellungen erneut gespeichert werden? Befindet es sich im Ordner Debug oder im Ordner C: \ Dokumente und Einstellungen \ BENUTZERNAME \ Lokale Einstellungen \ Anwendungsdaten?

Houman
quelle
3
Es befindet sich in dem Ordner, in dem sich die ausführbare Datei befindet. Wenn Sie sie also in Visual Studio unter Debug ausführen, befindet sie sich im Debug-Ordner Ihres Projekts.
Justin
1
Das Gleiche wie Justin. Wenn Sie in Visual Studio ausgeführt werden, wird die .config-Datei bei jedem erneuten Ausführen Ihrer Anwendung im Debug-Ordner Ihres Projekts überschrieben.
Welton v3.60

Antworten:

25

Vielleicht sollten Sie eine Einstellungsdatei hinzufügen. (zB App.Settings) Wenn Sie diese Datei erstellen, können Sie Folgendes tun:

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

Dies bedeutet, dass Sie Elemente bearbeiten und dann ändern können, wobei die Elemente stark typisiert sind, und das Beste ist, dass Sie vor der Bereitstellung keine XML-Datei berühren müssen!

Das Ergebnis ist eine Anwendungs- oder Benutzerkontexteinstellung.

Schauen Sie im Menü "Neues Element hinzufügen" nach der Einstellungsdatei.

Dan
quelle
1
Das Hinzufügen einer Settings.Settings-Datei oder das Verwenden der vorhandenen Datei unter Properties / Settings.settings ist dasselbe, oder? Im Falle der Verwendung des Exits würde ich Folgendes tun: Properties.Settings.Default.IntegrateWithPerforce = _integrateCheckBox.Checked; Properties.Settings.Default.Save ();
Houman
1
Gut möglich. Ich habe immer nur separate Dateien verwendet, da mir das gut getan hat. Wenn das der Fall ist, habe ich gerade etwas gelernt
Dan
Faszinierend, wenn Sie diesen UND den ConfigurationManager verwenden, landen alle Einstellungen ohnehin in der Datei App.config, jedoch in verschiedenen Abschnitten. Ich hatte 2 verschiedene Dateien erwartet.
RyanfaeScotland
Ich kann nicht glauben, dass ich die ganze Zeit eine XML-Datei durchlaufen habe. Vielen Dank für diesen nützlichen Tipp!
Smitty-Werben-Jäger-Manjenson
78

Ich weiß, dass ich zu spät bin :) Aber so mache ich es:

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

Weitere Informationen finden Sie unter MSDN

Wahid Bitar
quelle
3
Ein wichtiger Punkt, der bei den obigen Ausführungen zu beachten ist, ist, dass die Datei app.config bei jedem Erstellen überschrieben wird, wenn Sie dies über den Debugger (in Visual Studio) ausführen. Der beste Weg, dies zu testen, besteht darin, Ihre Anwendung zu erstellen, zum Ausgabeverzeichnis zu navigieren und von dort aus Ihre ausführbare Datei zu starten. --- von vbcity.com/forums/t/152772.aspx
yu yang Jian
69

Informationen zum Ändern von Werten im Abschnitt "appSettings" in Ihrer Datei "app.config":

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

macht den Job.

Natürlich ist die Einstellungsklasse eine bessere Übung, aber es hängt davon ab, wonach Sie suchen.

Marek
quelle
4
Nach drei kajillion AppSettings-Modifikationsideen im In- und Ausland ist dies die einfachste / beste und funktioniert (entscheidend) auch dann, wenn der Benutzer den <appSettings> -Knoten zerstört
Downwitch
39

Bevorzugen Sie <appSettings>zu <customUserSetting>Abschnitt. Mit (Web) ConfigurationManager ist das Lesen und Schreiben viel einfacher. Für ConfigurationSection, ConfigurationElement und ConfigurationElementCollection müssen Sie benutzerdefinierte Klassen ableiten und benutzerdefinierte ConfigurationProperty-Eigenschaften implementieren. Viel zu viel für alltägliche Sterbliche IMO.

Hier ist ein Beispiel für das Lesen und Schreiben in 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);

Vor:

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

Nach:

<appSettings>
  <add key="SomeKey" value="newValue" />
</appSettings>
Tom Wilson
quelle
23

Da es sich bei der Basisfrage um Gewinnformulare handelt, ist hier die Lösung: (Ich habe gerade den Code von user1032413 geändert, um die WindowsForms-Einstellungen wiederzugeben.) Wenn es sich um einen neuen Schlüssel handelt:

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

Wenn der Schlüssel bereits vorhanden ist:

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

Versuchen Sie, dies nach dem Speichern des Anrufs hinzuzufügen.

ConfigurationManager.RefreshSection( "appSettings" );
Justin
quelle
1
Dies ist besonders wichtig, wenn Sie schreiben und dann schnell hintereinander in derselben App lesen.
Trevor
6

Denken Sie daran, dass ConfigurationManager nur eine app.config verwendet - eine, die sich im Startprojekt befindet.

Wenn Sie einer Lösung A eine app.config hinzufügen und von einer anderen Lösung B aus darauf verweisen, wird app.config von A ignoriert, wenn Sie B ausführen.

So sollte beispielsweise ein Unit-Test-Projekt eine eigene app.config haben.

Doppelschleife
quelle
2

Ich denke, das Problem ist, dass im Debug Visual Studio nicht der normale exeName verwendet wird.

Es wird indtead "NameApplication" .host.exe verwendet

Der Name der Konfigurationsdatei lautet also "NameApplication" .host.exe.config und nicht "NameApplication" .exe.config

und nach dem Schließen der Anwendung kehrt sie zur hinteren app.config zurück

Wenn Sie also die falsche Datei oder die falsche Zeit überprüfen, werden Sie feststellen, dass sich nichts geändert hat.

chmouel kalifa
quelle
0

Sie können es manuell ändern:

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);
}
GalUnicode
quelle