Typsichere Settings mit eigenen Array-Typen  
Frank Dzaebel, erstellt am: 27.12.06, zuletzt geändert:  3.07.08
Kategorie: Implementation, .NET-Version: 2.0, [Download] [Download2]

Typsichere Settings (Einstellungen) sind unter .NET 2.0 ein neues Feature, dass sogar eigene Klassen über Designer einbindbar macht. Hier ein Beispiel einer Liste von Instanzen eines eigenen Datentyps "Daten".

Siehe auch:

-
Xml als C# Klasse
- Mit dem XmlSerializer eigene Objekte serialisieren und deserialisieren
- Aus XML mittels XSD.exe automatisch Schreib-Lese-Zugriffe generieren
- MSDN: Verwenden von Einstellungen in C#
- MSDN:
Gewusst wie: Erstellen von Anwendungseinstellungen mithilfe des Designers
- MSDN: Gewusst wie: Binden einer Eigenschaft an eine vorhandene Anwendungseinstellung mithilfe des Designers
 
1) Zunächst geht man über Menü Projekt/Eigenschaften in die Registerkarte Einstellungen.
2) Eingeben von [Name, Typ, Bereich, Wert] Paaren
3) Für benutzerdefinierte Typen unter Typ-Durchsuchen ihren Namespace-Namen nebst dem Klassennamen angeben.
4) Nun, wenn gewünscht, über den Button [...], Daten hinzufügen
Am Ende des Hinzufügens sehen die Daten etwa so  aus:

 
So sehen die Daten aus, wenn sie über die Methode SettingsAnzeigen in einer TextBox dargestellt werden:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using System.Configuration;
using SettingsExample2.Properties;
using System.Text;

namespace SettingsExample2
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    /// <summary>Zugriff auf die typsicheren Einstellungen.</summary>
    Settings Props = Properties.Settings.Default;

    private void Form1_Load(object sender,EventArgs e)
    {
      SettingsAnzeigen(txtMessage);
    }

    private void btnÄndern_Click(object sender,EventArgs e)
    {
      Props.Charge = "Neu: " + DateTime.Now.Millisecond;
      Props.Daten[0].Value = "Dat0: " + Props.Charge;
      Form1_Load(this,EventArgs.Empty);
    }

    private void btnSpeichern_Click(object sender,EventArgs e)
    {
      Props.Save();
      Form1_Load(this,EventArgs.Empty);
    }

    private void btnEinlesen_Click(object sender,EventArgs e)
    {
      Props.Reload();
      Form1_Load(this,EventArgs.Empty);
    }

    /// <summary>Zeigt die Einstellungen in der Textbox <paramref name="tb"/> an.</summary>
    /// <param name="tb">TextBox, in der die Ausgaben erscheinen sollen</param>
    private void SettingsAnzeigen(TextBox tb)
    {
      tb.Clear(); Props.Charge = Props.Charge;
      tb.AppendText("Einstellungen:" + NL);
      foreach (SettingsProperty sp in Props.Properties)
      {
        tb.AppendText(Indent(1) + sp.Name + "-Standardwert = " + sp.DefaultValue + NL);
        if (typeof(Array).IsAssignableFrom(sp.PropertyType))
        {
          SettingsPropertyValue spv = Props.PropertyValues[sp.Name];
          if (spv == null || spv.PropertyValue == null) continue;
          Array array = (Array)spv.PropertyValue;
          foreach (object element in array)
            tb.AppendText(element.ToString() + NL);
        }
        else
          tb.AppendText(Indent(2) + "Wert = " + GetPropValue(sp.Name) + NL);
      }
    }

    /// <summary>Der Wert der Eigenschaft mit Namen <paramref name="propertyName"/> wird als string zurückgegeben.</summary>
    /// <param name="propertyName">Name der Eigenschaft</param>
    private string GetPropValue(string propertyName)
    {
      SettingsPropertyValue spv = Props.PropertyValues[propertyName];
      if (spv == null || spv.PropertyValue == null) return "[null]";
      return spv.PropertyValue.ToString();
    }

    /// <summary>Ruft die für diese Umgebung definierte Zeichenfolge für Carriage Return ab.</summary>
    static public string NL = Environment.NewLine;

    /// <summary>Einrückungen</summary>
    static string[] indents = {" ", " ", " "};

    /// <summary>Einrückungs-Zeichenkette, die mit <paramref name="multiplikator"/> 
    /// vervielfacht bei Anzeige ggf. vor die Werte gesetzt wird.</summary>
    /// <param name="multiplikator">Das Vielfache der Länge des linken Abstandes.</param>
    static public string Indent(int multiplikator)
    {
      if (multiplikator >= 0 && multiplikator < indents.Length)
        return indents[multiplikator];
      else return "";
    }
  }

  public class Daten
  {
    long id = 0;
    public long Id
    {
      get { return id; }
      set { id = value; }
    }

    string value = "0000";
    public string Value
    {
      get { return this.value; }
      set { this.value = value; }
    }

    public override string ToString()
    {
      return Form1.Indent(2) + "[Id=" + this.Id + ", Value=" + Value + "]";
    }
  }
}