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?
Antworten:
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.
quelle
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
quelle
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.
quelle
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>
quelle
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);
quelle
Versuchen Sie, dies nach dem Speichern des Anrufs hinzuzufügen.
ConfigurationManager.RefreshSection( "appSettings" );
quelle
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.
quelle
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.
quelle
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); }
quelle