Donnerstag, 17. April 2008

Speichern von UserSettings

Das Speichern von Konfigurationseinstellungen ist sicherlich für viele von uns etwas, das einem ständig über den Weg läuft. Leider war es unter der Version 1.1 des .Net-Frameworks nicht möglich, in die Konfigurationsdatei zu schreiben, was bedeutete, dass man eine eigene Lösung, meist basierend auf XML, erstellen musste. Seit der Version 2.0 ist es dem Programmierer jedoch erlaubt, in eben jene Datei zu schreiben. Geradezu paradiesisch, wenn man das nicht gewohnt ist.

Wie genau das zu bewerkstelligen ist, kann man bei MyMSDN nachlesen, und zwar genau hier: Wie speichere ich Konfigurationseinstellungen meiner Anwender?

An und für sich ist die Anleitung dort sehr gut, doch mir persönlich fehlen einige Informationen. Beispielsweise wird nicht darauf eingegangen, wie man auf einfache Art und Weise die Konfigurationsdatei anpassen kann. Aus diesem Grund werde ich das Vorgehen hier noch einmal kurz erläutern, um auch die letzten Fragen aus dem Weg zu räumen.

  1. Erstellen der Settings
    Wurde mit Hilfe von Visual Studio eine Solution angelegt, so findet sich zu Beginn die folgende Ordnerstruktur:

    1

    Erweitert man hier den Ordner Properties, findet man eine Datei Namens Settings.settings. Öffnet man diese, hat man die folgende Übersicht vor sich:

    2

    In diesem Fenster ist es nun möglich, die benötigten Konfigurationsschlüssel, deren Datentypen sowie die Default-Werte einzutragen. Um den Wert des Konfigurationsschlüssels ändern zu können, muss im Feld Bereich unbedingt Benutzer eingetragen sein. Wird statt dessen Anwendung verwendet, ist der Konfigurationsschlüssel aus dem Code heraus nicht veränderbar. Diese sollten für Werte verwendet werden, die immer gleich bleiben, beispielsweise die Adresse eines Webservice.
    Ist die Bearbeitung abgeschlossen, kann die Datei gespeichert und geschlossen werden.

    HINWEIS:
    Wirt man jetzt einen Blick in die Datei app.config, wird man feststellen, dass die soeben in der Datei Settings.settings erstellten Konfigurationsschlüssel hier eingetragen wurden. Das bedeutet, dass man hier auch direkt das XML hätte bearbeiten können, doch ist die Erstellung über die Datei wesentlich einfacher, weshalb diese sicherlich bevorzugt werden wird.

  2. Lesen von Konfigurationsdaten
    Der erste Schritt, um via Code die Konfiguration auszulesen bzw. zu schreiben, ist ein Using-Statement. Es muss der Namespace der eigenen Applikation, gefolgt von einem Properties eingebunden werden. In unserem Beispiel wäre das also:

       1:  using WindowsFormsApplication1.Properties;

    Nun kann eine Instanz der Klasse Settings angelegt werden, die unsere Konfigurationsschlüssel in Form von Properties vorhält. Dem entsprechend einfach ist es dann auch, die Werte auszulesen. Die Instanz sollte sinnvollerweise als privates Feld angelegt werden, damit der Zugriff darauf jederzeit möglich ist. Der ideale Ort zum Auslesen der Konfiguration ist das FormLoad-Event.

       1:  Settings userSettings = new Settings();
       2:   
       3:  private void Form1_Load(object sender, EventArgs e)
       4:  {
       5:      this.textBox1.Text = userSettings.Text;
       6:  }

    Hiermit wird der Schlüssel Text aus der Konfiguration ausgelesen und in die Textbox geschrieben. Wird die Applikation nun gestartet, sehen wir den Erfolg:

    3

    Der in unserer Konfiguration hinterlegte Text wurde tatsächlich in die TextBox geschrieben.

  3. Schreiben von Konfigurationsdaten
    Entsprechend des Vorgehens zum Lesen der Konfiguration funktioniert auch das Schreiben. Wir weisen einfach der zu ändernden Eigenschaft einen neuen Wert zu. Was man an dieser Stelle jedoch unbedingt beachten muss, damit der Wert tatsächlich gespeichert wird, ist der Aufruf der Methode Save der Settings-Instanz.
    Der beste Ort zum Speichern der veränderten Werte, zumindest in unserem Beispiel, ist das FormClosed-Event. In der Regel bietet sich hier allerdings eher das Click-Event eines Speichern-Buttons an. Der Code für unser Beispiel gestaltet sich wie folgt:

       1:  private void Form1_FormClosed(object sender, FormClosedEventArgs e)
       2:  {
       3:      userSettings.Text = this.textBox1.Text;
       4:      userSettings.Save();
       5:  }

    Wenn wir jetzt die Applikation erneut starten, den Text ändern, die Applikation beenden und gleich darauf wieder starten, sollte der geänderte Text in der TextBox sichtbar sein. Und siehe da, es hat - jedenfalls bei mir - wunderbar funktioniert.

    4

  4. Wichtiger Hinweis zum Schluss
    Etwas ganz Wichtiges noch zum Abschluss dieses kleinen Exkurses.
    Schaut man in die *.conifg-Datei, die im Verzeichnis liegt, in das die kompilierte Datei von Visual Studio gelegt wird, stellt man fest, dass hier nach wie vor der Standard-Wert steht. Startet man jedoch die Applikation, ist nicht etwa der Default-Wert zu sehen, sondern der geänderte. Um diesem Rätsel auf die Spur zu gehen, sollte man den Ordner C:\Dokumente und Einstellungen\Windows_Benutzer\Lokale Einstellungen\Anwendungsdaten\ aufsuchen. Dort findet sich ein Ordner, der den Namen der in der AssemblyInfo eingetragenen Firmennamen trägt, darunter einen mit dem Namen der Applikation und hierunter wiederum einen mit der entsprechenden Version. Ist man dort endlich angekommen, findet man eine Datei namens user.config. Schaut man sich nun diese Datei an, wird man den Wert finden, der auch tatsächlich in unserem Test innerhalb der TextBox zu sehen ist. Hier werden also unsere Konfigurationswerte abgelegt. Die *.config-Datei dient demnach nur noch dazu, um zum einen auf die user.config zu verweisen und zum anderen, um die Default-Werte vorzuhalten, die jederzeit mit dem Aufruf

       1:  userSettings = Settings.Default;

    wiederhergestellt werden können.
    Will man seine Applikation wieder restlos aus dem System tilgen, müssen also nicht nur *.exe und *.config vom Ausführungsort entfernt werden, sondern auch die user.config aus dem Anwendungsdaten-Ordner.

  5. Fazit
    Wie hier zu sehen ist, ist mit dem .Net-Framework in der Version 2.0 das Schreiben von Konfigurationsdaten extrem simpel geworden. Einfach grandios, wenn man an die Verrenkungen denkt, die man teilweise unter der Framework-Version 1.1 machen musste, um seine Konfiguration "benutzbar" zu machen.
    Ich hoffe, ich konnte einigen etwas neues zeigen und ihnen so das Leben erleichtern.

2 Kommentare:

Tropensturm hat gesagt…

Echt Klasse Basti :) Gefällt mir sehr!

BBo hat gesagt…

Sehr gütig, Dankeschön.

Solltet ihr anhand dieses HowTos mal eine Verwaltung von UserSettings implementieren und Unstimmigkeiten feststellen, lasst es mich bitte wissen, damit ich den Eintrag entsprechend bearbeiten kann.

Danke schonmal im Voraus für die Unterstützung.