Mehrere Fenster - Interaktion
-
Hallo Leute,
ich wollte mal Fragen ob es eine Art "Best practice" gibt, um Anwendungen mit mehreren Fenstern zu schreiben.
Beispiel:
Ich klicke auf ein ListenElement, danach soll (abh. vom ListenElement) ein neues Form geöffnet werden. In diesem Form wird eine weitere Auswahlliste angezeigt. Der Benutzer kann nun ein Element dieser Liste wählen und damit schließt sich das Fenster wieder. Beim schließen wird die Information (welches Element wurde im neuen Form gewählt) an das erste Form übertragen.Meine bisherige Lösung: Das neu geöffnete Form bekommt eine Referenz auf das alte Form. Vor dem Schließen wird die Information an das alte Form (per Methodenaufruf auf diesem) übertragen und danach das neue Form geschlossen.
Diese Lösung finde ich umständlich und nicht sonderlich hübsch. Ich glaube auch, dass man es eigentlich anders macht. Daher meine Frage: Wie löst ihr ähnliche Probleme? Gibt es eine BestPractice, evtl. mit Source-Code Beispiel?
Wäre echt super
Viele Grüße
-
Ein paar Fragen?
- Warum fügst du nicht einfach die Listenelemente aus dem Extrafenster in das alte Listenfester ein?
- Wenn es sonst zu übersichtlich wird, warum misst du dann nicht ein TreeView?
- Wenn es nur erweiterte Auswahlmöglichkeiten sind, die nur für bestimmte Benutzer (Profis) einfach zugäglich sein sollen, warum erstellst du dann nicht ein CheckBox "erweiterte Auswahlmöglichkeiten anzeigen" under deiner ListBox oder in die Anwendungseinstellungen?
EDIT: Darstellung
Alternative (im Kopf):Form MainForm
Form SelectionForm
> Eigenschaft SelectedObject
> Konstruktor (Array oder IEnumerable<T> mit auswahlmöglichekeiten)Die Selectionform wird mit den Auswahlmöglichekiten erstellt und über ShowDialog (wenns modal sein soll - sonst mit EvenHandler für Form Close) angezeigt und beim Beenden von Selectionform der Wert von SelectedObject abgefragt.
-
So wie mein Vorposter schon angedeutet hat, sollten sich die Forms NICHT gegenseitig kennen, sondern die Werte mittels Ereignissen (Events) oder Eigenschaften (Properties) übertragen werden.
Der untergeordneten Form muß es vollkommen egal sein, von wo sie aufgerufen wird (hierarchisches Design sowie Kapselungsprinzip).
-
Hallo Leute..
ich habe ein sehr ähnliches Problem, und übergebe ebenfalls Referenzen.
Kann vlt. jemand nen Link zu einem konkreten Beispiel posten (oder alternativ hier einen Sourcecode-Auszug posten), wie man Informationen an ein neues Fenster übergibt und von diesem an das ursprüngliche Fenster zurück schicken kann?Verstehe nicht ganz wie das mit Ereignissen oder Properties funktionieren kann... und um Properties zu setzen brauche ich doch auch die Referenz auf das eigentliche Objekt, oder?
Wäre echt super, wenn wir das hier klären könnten (wäre ein Fall für die FAQ).
Danke euch
Chris
-
Bei modalen Unterfenstern reicht es, einfach auf die Properties nach dem Aufruf zuzugreifen:
// in Form1 using(Form2 form2 = new Form2()) // Dispose wird am Ende aufgerufen { // Properties setzen form2.Text = "Hallo World!"; form2.Number = 42; if(form2.ShowDialog(this) == DialogResult.OK) { // Zugriff auf Properties string text = form2.Text; int number = form2.SelectedNumber; } }
Bei nicht-modalen Fenstern sollte der Zugriff dann über ein Ereignis (Event) erfolgen, und in diesem kann dann auf die Properties des anderen Fensters zugegriffen werden (wie oben).
Evtl. ist meine Wortwahl "NICHT gegenseitig" falsch verstanden worden, damit meine ich, daß nur der Aufrufer das andere (untergeordnete) Form kennen sollte (aber niemals umgekehrt bzw. beide sich gegenseitig!).
Man sollte auch nie direkt auf die Steuerelemente einer Form direkt zugreifen, sondern immer nur Daten austauschen (evtl. dafür dann eine eigene Klasse bzw. Struktur definieren).
P.S: Ich kann dir auch noch das http://www.mycsharp.de/wbb2/forum.php empfehlen (das ebenfalls eine sehr gute FAQ sowie Artikel besitzt).