2017-03-22 1 views
0

Ich schreibe eine Anwendung mit Windows Forms, .NET 4.6, mit einer Reihe von Einstellungen in der Laufzeit konfigurierbar. Das Ändern, Hinzufügen und Löschen von Einstellungen funktioniert innerhalb eines Laufs, aber alle Änderungen gehen verloren, wenn die App geschlossen wird. Ich benutze Properties.Settings.Default.Save() kurz vor dem Hauptfenster schließt:Wie ordnungsgemäß Properties.Settings.Default.Save() verwenden?

private void TestersList_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     Properties.Settings.Default.Save(); 
    } 

A user.config Datei in AppData wie erwartet erstellt wird, sondern nur eine der Einstellungen dort gespeichert, unabhängig davon, was ich damit mache oder irgendeine andere Einstellung in der Laufzeit.

Alle Einstellungen sind im Benutzerbereich definiert und als Strings serialisiert. Ich sehe nichts, was den Erretteten anders macht als die anderen. Unten finden Sie ein Teil von app.config:

<userSettings> 
<DailyChecklist.Properties.Settings> 
    <setting name="SerialPattern2" serializeAs="String"> 
    <value>\d{10}_0_None</value> 
    </setting> 
    </setting> 
    <setting name="SerialPatternDebug" serializeAs="String"> 
    <value>123456789</value> 
    </setting> 
    <setting name="TestersToIgnore" serializeAs="String"> 
    <value>dummy;</value> 
    </setting> 
    <setting name="SerialPatternDefault" serializeAs="String"> 
    <value>\D\d]{3}\D{2,3}\d{4}\d{5}</value> 
    </setting> 
    <setting name="ServerAdress" serializeAs="String"> 
    <value>address/goes/here</value> 
    </setting> 
</DailyChecklist.Properties.Settings> 
</userSettings> 

Und nach dem Speichern Ich habe dies in user.config:

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
<userSettings> 
    <DailyChecklist.Properties.Settings> 
     <setting name="TestersToIgnore" serializeAs="String"> 
      <value>dummy;</value> 
     </setting> 
    </DailyChecklist.Properties.Settings> 
</userSettings> 
</configuration> 

Wie kann ich es alle Einstellungen in user.config machen Speichern?

Vielen Dank im Voraus!

PS. Ich habe überprüft, dass es nicht der Bereich ist, ich habe kein "*" in Assembly-Informationen und die Datei, die ich überwacht habe, ist die einzige erstellte Datei (keine Version/Build-Nummer ändert sich). Es wird geändert (nach Notizblock ++) und wenn ich TesterToIgnore ändere, wird sein neuer Wert gespeichert, aber alle anderen Einstellungen fehlen.

+0

Projekt> Eigenschaften> Registerkarte Einstellungen. Achten Sie auf die Spalte "Umfang". –

+0

Hallo Hans, danke für deinen Kommentar, aber wie ich in der Frage geschrieben habe, sind alle Einstellungen im Benutzerbereich. Ich habe nichts im Anwendungsbereich. – Bogna

Antwort

0

Nun, ich habe es schließlich herausgefunden, also lasse ich es hier für zukünftige unglückliche Seelen. Das magische Wort ist: foreach.

Obwohl es möglich ist, durch Properties.Settings.Default.Properties in einer foreach Schleife zu durchlaufen, sind Änderungen vorübergehend. Ich meine Lösung wie:

 foreach(SettingsProperty setting in Properties.Settings.Default.Properties) 
     { 
      if(setting.Name.Contains("someKeyWord")) 
       Properties.Settings.Default[setting.Name] = someNewSettingValue; 
     } 

scheint im aktuellen Lauf zu arbeiten, aber Änderungen sind nach dem Neustart verloren. Properties.Settings.Default.Save() speichert aus irgendeinem Grund nichts, was innerhalb einer Schleife geändert wurde.

Ich überprüft und Properties.Settings.Default[setting.Name] = someNewSettingValue; funktioniert gut außerhalb einer Schleife und wird normalerweise dann gespeichert.

Wenn Sie dynamisch hinzugefügte Einstellungen benötigen, sollten Sie eine einzige Einstellung verwenden, die als eine der folgenden Typen konfiguriert wurde: System.Collections.Specialized. Es macht Ihren Code vielleicht weniger transparent, aber zumindest behandelt er Loops gut.

Verwandte Themen