Laden...

Abspeichern der Stati von vielen GUI-Controls um diese beim Start wieder herzustellen

Erstellt von christof.k vor 10 Jahren Letzter Beitrag vor 10 Jahren 2.094 Views
C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 10 Jahren
Abspeichern der Stati von vielen GUI-Controls um diese beim Start wieder herzustellen

Hallo,
ich suche nach einer schnellen (von der Aufwandsseite) Möglichkeit den Status von meinen GUI Feldern (Comboboxes, Checkboxes, Textfelder, ...) beim Schließen der Applikation zu speichern um diese beim Start der Applikation wieder zu laden.
Hintergrund sind die vielen Controls und der Wunsch der Nutzer diese nicht bei jedem Start setzen zu müssen (Meine Applikation simuliert Signale auf dem CAN Bus und jedes Signal kann individuell gesteuert werden).

Die meiner Meinung nach aufwändige Variante ist es, den Status jedes Controls abzufragen, in einem XML zu sichern und beim Laden wieder jedes Control einzeln zu initialisieren....meine Hoffnung ist, dass es noch eine pfiffigere Möglichkeit gibt....

Mit der Bitte um Feedback.
Danke
Christof

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo christof.k,

da sich Controls nicht serialisieren lassen, denke ich, dass du nicht umhinkommen wirst, deren Zustand selbst auszulesen. Natürlich musst du das nicht unbedingt für jede einzelne Eigenschaft ausprogrammieren, sondern kannst Reflection benutzen.

herbivore

C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 10 Jahren

Hi,
danke für das Feedback. Zumindest muss ich nicht weitersuchen 😉
Mein "Problem" ist, dass ich meine Applikation in viele Einzelfenster (tabControl gesteuert) gesplittet habe und jedes Tab durch eine eigene Klasse dargestellt wird (jeweils ein UserControl welche das gesamte SubGUI für den entsprechenden Tab enthält).
Damit sind die Controls nicht global verfügbar und ich muss eine Threadsichere Get-Funktion für alle einzelnen erstellen und zentral die Stati (.Checked, .SelectedIndex, .Text) zum Speichern einsammeln.

Da für das Sichern der Zustände die Kapselung eher hinderlich ist hier noch die letzte Frage: Wir kann ich am einfachsten den Status aller Controls zentral erreichen?

Danke nocheinmal
Christof

16.835 Beiträge seit 2008
vor 10 Jahren

Im Prinzip musst Du die Forms durchlaufen, und quasi jede Form für sich abspeichern.
Hier kannst Du ja rekusriv durchgehen und anhand des Control-Namens und Typs dann weiter vorgehen.

Im Endeffekt bleibt Dir aber wenig möglichkeit das Generisch zu handhaben.
Eine Checkbox musst Du eben wie eine Checkbox behandeln und nicht wie dessen Basisklasse Control.

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo christof.k,

Damit sind die Controls nicht global verfügbar

was heißt schon global. Zumindest sind sie - wie Abt gesagt hat - (rekursiv) über die Controls-Collection verfügbar.

und ich muss eine Threadsichere Get-Funktion für alle einzelnen erstellen

Nö, da muss nichts thread-sicher sein. Zugriffe auf das GUI und seine Controls müssen immer single-threaded aus dem GUI-Thread erfolgen, siehe [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke).

Eine Checkbox musst Du eben wie eine Checkbox behandeln und nicht wie dessen Basisklasse Control.

Naja, wenn man das per Reflection macht und eine Liste mit Namen der sichernden Eigenschaften hat, kann es einem ziemlich egal sein, von welchem Typ das Control ist. Hat es die Eigenschaft nicht, dann wird sie eben nicht gesichert.

Auf den Typ müsste man nur dann gucken, wenn man eine Eigenschaft hat, die es in mehreren Control-Typen gibt, die aber beim Typ A gesichert werden soll, aber beim Typ B nicht. Und natürlich muss man den Typ der aktuellen Controls mit speichern, damit man beim Laden wieder ein Control dieses Typs erzeugen kann.

herbivore

T
111 Beiträge seit 2005
vor 10 Jahren

Hallo christof.k,

Du könntest auch eine Klasse mit der Struktur Deiner Eingaben erstellen und die entsprechenden Properties der Controls an die einzelnen Elemente binden. Dann kannst Du die Klasse einfach serialisieren und beim Start wieder deseralisieren. Wenn Du auch noch INotifyPropertyChanged implementierst kann die Speicherung gleich bei jeder Änderung geschehen.

Thomas

C
christof.k Themenstarter:in
159 Beiträge seit 2005
vor 10 Jahren

Jetzt kommt der Teil wo ich leider noch ein paar Stichworte brauche - Sorry.

Habe es gerade kurz versucht zu implementieren und habe noch ein paar Fragen.


public struct TabStuct
{
    public UserControl TabReference;
    public string TabName;
}

public TabStuct[] Tabs = new TabStuct[11];

void FillTabs
{
    // hier werden die Usercontols instanziiert und das Array Tabs gefüllt
}

void ScrollThroughControls()
{
    foreach (TabStuct tab in Tabs)
    {
        Console.WriteLine("**** " + tab.TabName);
        foreach (Control control in tab.TabReference.Controls)
        {
            Type type = control.GetType();
            Console.WriteLine(type.ToString() + " " + control.Name);
        }
    }
}

Output:

\**** Tab1
System.Windows.Forms.TableLayoutPanel tableLayoutPanel1
System.Windows.Forms.Label label13
\**** Tab2
System.Windows.Forms.TableLayoutPanel tableLayoutPanel1
System.Windows.Forms.Label label13
\**** Tab3
System.Windows.Forms.TableLayoutPanel tableLayoutPanel1
System.Windows.Forms.Label label13
\**** Tab4
System.Windows.Forms.Label label4
System.Windows.Forms.TableLayoutPanel tableLayoutPanel1
\**** Tab5
System.Windows.Forms.Label label4
System.Windows.Forms.TableLayoutPanel tableLayoutPanel1.....

Mein Problem ist nun das ich nur das tableLayoutPanel bekomme und nicht die Controls darin....wie komme ich da vernünftig weiter und bin ich auf dem richtigen Weg?

Danke
Christof

49.485 Beiträge seit 2005
vor 10 Jahren

Hallo christof.k,

das Stichwort wurde schon genannt und ist eigentlich auch offensichtlich: Rekursion.

herbivore