Laden...

Position von mehreren Steuerelementen sinnvoll speichern und während der Laufzeit laden.

Erstellt von Console32 vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.490 Views
Thema geschlossen
C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren
Position von mehreren Steuerelementen sinnvoll speichern und während der Laufzeit laden.

Hallo,

ich habe folgendes Problem bei meinem Programm,
und zwar habe ich auf einigen Forms, verschiedene Hintergrundbilder (wird von einer steuerung entschieden)
Je nach Hintergrundbild sollen dann zur laufzeit die Steuerelemente (einmalig) angeordnet werden.

Jetzt habe ich das Problem das ich bis zu ca 7 unterschiedliche Positionen für meine Steuerelemente habe welche irgendwie sinnvoll Organisiert werden müssen.

Ich dachte an ein XML, jedoch wollte ich nachfragen ob es auch andere/elegantere Lösungen gibt oder auch schon fertige Lösungsansätze.

C
22 Beiträge seit 2011
vor 12 Jahren

Halli-Hallo,

...hmmm.....so ganz blicke ich bei der Frage nicht durch, aber ich habe es so verstanden:

Dein Programm soll sich merken, wo auf der Form die Steuerelemente zur Laufzeit angeordnet waren (X-Y Positionen, Parent-Container etc.) . Den "Zustand" möchtest Du speichern und bei der nächsten Sitzung wieder herstellen.

Ich denke, so etwas kommt weniger häufig vor und deshalb wirst Du entsprechend wenige Antworten bekommen.

Ich würde das pro Benutzer und pro Formular speichern und mir dafür eine seperate Klassenbibliothek aufbauen:

Formular => Steuerlement => Container => Position X,Y innerhalb Container

Deiner Fantasie sind keine Grenzen gesetzt. Hauptsache ein "Dritter" versteht das hinter auch noch und es läuft sauber.

Viel Glück 😉

Carl

49.485 Beiträge seit 2005
vor 12 Jahren

Hallo carl,

ich finde kaum ungewöhnliches an dem Problem. Sich (Positions-)Daten zu merken und später wiederherzustellen, ist doch das normalste von der Welt. Ob man sich nun die Position und Größe der Fenster merkt, wie das viele Anwendungen machen, oder die von enthaltenen Controls macht keinen großen Unterschied.

Hallo Console32,

für mich jedenfalls ein klarer Fall von [Tutorial] Konfigurationsmodell im .NET Framework.

Die Informationen in die Steuerelemente zu übertragen, nachdem du sie aus der Konfigurationsdatei ausgelesen hast, sollte auch nicht das Problem sein.

Bitte beachte für alle Teile der Frage vorsorglich [Hinweis] Wie poste ich richtig? Punkt 1.1.1 und 1.1.

herbivore

C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren

Hallo,

Ob nun ein XML oder die Config,
das problem ist nicht die Realisierung sondern der aufwand. Die Positionsdaten für ~30-200 Controlls * 16 Forms * bis zu 7 unterschiedliche "Positionssets" zu schreiben, ist viel aufwand.

Im Programm sieht es dann so aus das auf einer Steuerung eine Variable entscheidet welches Hintergrundbild geladen wird, zum Bild dazu soll ein "Positionsset" für die Controls geladen werden

Das ganze soll zur Laufzeit NUR Geladen werden, und im vorhinein von mir definiert werden.

Meine Frage war eher ob es andere Möglichkeiten gibt die Positionen aller Controls zu speichern (idealerweiße im Designer), oder möglicherweiße eine Fertiges Modul für die Laufzeit welches ich implementiere damit ich meine Positionsdaten nicht "zu Fuß" schreiben muss.
(bzw damit ich mir die Funktionalität Save / Load PositionSet nicht selbst bauen muss) Ich hatte gehofft das jemand schon mit einem ähnlichen Problem zu tun hatte. 😉

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Console32,

Meine Frage war eher ob es andere Möglichkeiten gibt die Positionen aller Controls zu speichern (idealerweiße im Designer), oder möglicherweiße eine Fertiges Modul für die Laufzeit welches ich implementiere damit ich meine Positionsdaten nicht "zu Fuß" schreiben muss.

Spontan würde ich alle Controls mit dem Designer so anordnen, wie ich sie haben möchte, dann die Anwendung starten und dann zur Laufzeit die XML-Datei programmatisch erzeugen (dazu alle Controls rekursiv durchgehen).

Ansonsten kannst du evtl. auch was mit Databinding an Resourcendateien hinbekommen.

C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren

Spontan würde ich alle Controls mit dem Designer so anordnen, wie ich sie haben möchte, dann die Anwendung starten und dann zur Laufzeit die XML-Datei programmatisch erzeugen (dazu alle Controls rekursiv durchgehen).

Das wird es wohl werden.
Dachte das Problem hätte vl schon jemand gehabt.

C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren

Hallo

Soweit ist das alles kein Problem die Xml Datei wird erzeugt,
jedoch hab ich ein Problem beim setzten der Sichtbarkeit.

Beim Programmstart funktioniert alles wunderbar, wenn ich ein "Positonsset" auswähle bei dem weniger Controls angezeigt werden sieht es genau so aus wie ich es im Vorhinen gespeichert habe.

Ändere ich jetzt jedoch das "Positionsset" zur Laufzeit, sind alle Childcontrolls weg.

Hier die Rekursive Funktion welche die daten aus dem XML File lädt:

 private static void LoadControl(XmlNode root, Control.ControlCollection controls, XmlDocument doc)
        {
            XmlNode xmlNode;
            foreach (Control control in controls)
            {
                xmlNode = null;
                foreach (XmlNode node in root.ChildNodes)
                {
                    if (node.Attributes[0].Value == control.Name)
                    {
                        xmlNode = node;
                        break;
                    }
                }
                if (xmlNode != null)
                {
                    LoadControl(xmlNode, control.Controls, doc);

                    control.Location = new Point(Convert.ToInt32(xmlNode.Attributes[1].Value), Convert.ToInt32(xmlNode.Attributes[2].Value));
                    control.Visible = Convert.ToBoolean(xmlNode.Attributes[3].Value);
                    control.Width = Convert.ToInt32(xmlNode.Attributes[4].Value);
                    control.Height = Convert.ToInt32(xmlNode.Attributes[5].Value);
                }
            }
        }

control.Visible = Convert.ToBoolean(xmlNode.Attributes[3].Value);

In der Zeile bleibt das Visible Attribut auf false (Obwohl es sich um Controls OHNE ChildControls handelt / Und das Convert.ToBoolean true zurückliefert)

leider bin ich nocht nicht fündig geworden warum das Attribute auf false bleibt :S
Weiß jemand was es damit auf sich hat?

5.742 Beiträge seit 2007
vor 12 Jahren

Hallo Console32,

warum das (indexbasierte 😜 ) Rumhantieren direkt an dem XML-Dokument?
Verwende besser XML-Serialisierung.

Dispost du an irgendeiner Stelle Controls?

C
Console32 Themenstarter:in
258 Beiträge seit 2011
vor 12 Jahren

weil ich noch nie mit XML als Resource gearbeitet habe / bzw weil das das erste war was google / msdn ausgespuckt hat und ich keine Ahnung von Serialisierung habe.
Bei möglichkeit werde ich mich damit beschäftigen.

zum Dispose:
nein das Form wird nur geschlossen (wird als ShowDialog angezeigt)und somit nicht Disposed.
Nachdem ich im onLoad jetzt this.Visible = true; gesetzt habe funktioniert es.

Thema geschlossen