Laden...

ComplexConverter - Benutzereinstellungen persistent machen

Erstellt von ErfinderDesRades vor 15 Jahren Letzter Beitrag vor 15 Jahren 3.223 Views
ErfinderDesRades Themenstarter:in
5.299 Beiträge seit 2008
vor 15 Jahren
ComplexConverter - Benutzereinstellungen persistent machen

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.