ComplexConverter - Benutzereinstellungen persistent machen
Ich hab hier eine Klasse, die konvertiert alles, was man reinwirft in denselben String, durch Separatorzeichen getrennt.
Und restauriert die Daten auch wieder anhand des Strings. Den String kann man in den Settings speichern, und beim nächsten Programmstart sein Form (Bounds, Spaltenbreiten von ListViews, SplitContainer.SplitterDistance, ...) wieder genau so restaurieren, wie man es geschlossen hat. Man kann sogar TreeViews wieder herstellen, mit allen Nodes, und ob sie expandiert waren, wasweißich.
Der Hack: Restaurier- und Speicher-Code sind identisch. Nicht gleich, nein, _derselbe _Code wird zum Speichern wie zum Restaurieren verwendet. Wenn also an 21. Stelle ein bool geschrieben wurde, wird beim Restaurieren zwingend genau an 21. Stelle auch ein bool abgerufen. Und auch für dasselbe Control verwendet, dem der Wert ursprünglich abgelesen wurde. (Kunststück - es ist derselbe Code!).
Allerdings muß man schon was coden, um dem ComplexConverter bekannt zu machen, wasser schreiben soll. Dazu wirft er ein Event, wie gesagt - er wirft dasselbe Event zum Lesen wie zum Schreiben.
In diesem Event mag man etwa sowas coden:
/// <summary>komplexe Konvertierung für dieses Form</summary>
private void _Memory_Convert(object sender, ComplexConverter.EventArg e) {
// Form-Properties konvertieren
this.WindowState = e.ConvertValue(this.WindowState);
this.Bounds = e.ConvertValue(this.Bounds);
// ListView-Spaltenbreiten konvertieren
foreach (ColumnHeader Col in this.ListView1.Columns) {
Col.Width = e.ConvertValue(Col.Width);
}
// ListView-Items konvertieren
e.ConvertList<ListViewItem>(ListView1.Items);
foreach (ListViewItem LVI in ListView1.Items) {
// ListView-SubItems konvertieren
e.ConvertList<ListViewItem.ListViewSubItem>(LVI.SubItems);
foreach (ListViewItem.ListViewSubItem LVSI in LVI.SubItems) {
LVSI.Text = e.ConvertValue(LVSI.Text);
}
}
}
Das persistiert jetzt Form.Bounds, alle Spaltenbreiten des ListViews, alle ListViewItem incl. Subitem.
Ist halt eine etwas beknackte Formulierung, daß man schreiben muß:
LVSI.Text = e.ConvertValue(LVSI.Text);
Der linke Teil der Zuweisung dient der Restaurierung, der rechte dem Abspeichern.
Listen werden übrigens anders persistiert:
e.ConvertList<ListViewItem>(ListView1.Items);
Beim Speichern merkt er sich nur die Anzahl, und beim restaurieren generiert er diese Anzahl an leeren Items in die Liste. Die weitere Restaurierung der Item muß durch folgende .ConvertValue-Aufrufe gewährleistet werden.
Die Beispiel-Anwendung persistiert ein TreeView, ein ListView und die Form-Bounds. Der SpeicherString wird ausnahmsweise auch in eine RTF geschrieben und gelesen, aber normalerweise bleibt er verborgen in der Config-Datei.
Schlagwörter: settings,config,Konfiguration,persistenz,einstellungen,speichern
Der frühe Apfel fängt den Wurm.