Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Abspeichern der Stati von vielen GUI-Controls um diese beim Start wieder herzustellen
christof.k
myCSharp.de - Member



Dabei seit:
Beiträge: 160

Themenstarter:

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

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von christof.k am .
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
christof.k
myCSharp.de - Member



Dabei seit:
Beiträge: 160

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16098

beantworten | zitieren | melden

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.
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo christof.k,
Zitat
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.
Zitat
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).
Zitat
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
private Nachricht | Beiträge des Benutzers
thomas.at
myCSharp.de - Member



Dabei seit:
Beiträge: 102
Herkunft: Österreich / Wien

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
christof.k
myCSharp.de - Member



Dabei seit:
Beiträge: 160

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 52329
Herkunft: Berlin

beantworten | zitieren | melden

Hallo christof.k,

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

herbivore
private Nachricht | Beiträge des Benutzers