Tatsächlich gibt es kaum professionelle Anwendungen, die auf mehrere Forms angewiesen sind.
Um genau zu sein: Ich kenne das nur von Messenger-Programmen, und da finde ich es recht unpraktisch, bei Bedarf das jeweils andere Form in der Taskleiste suchen zu müssen.
Wozu könnte man ein Form2Form-Design brauchen?
- Navigation in einem Form, Arbeitsfläche auf dem anderen? - da bietet sich eigentlich der SplitContainer geradezu an.
- Eingabe auf dem einen Form, Ergebnis-Ansicht auf dem anderen? - Für den User klarer strukturiert wäre ein TabControl mit den 2 Reitern "Eingabe" und "Ergebnis"
- Arbeitsfläche auf dem einen, Administration auf dem anderen (mein Messenger ist so gestrickt)? - ebenfalls evtl. besser auf einem TabControl.
Von diesem "echten" (und fragwürdigen) Form2Form-Design zu unterscheiden sind modale Dialoge: Passwort-Eingabe, Datei-Suche, Farb-Auswahl, Druck-Vorschau, sowas.
Hier ist die Kommunikation super einfach, schön prozedural - HauptForm startet den Dialog, und wertet die Eingaben aus, nachdem er geschlossen wurde.
Auch modale Dialoge können sehr unfreundlich sein - viele Datenbänker lieben es ja, für jeden Eintrag ein Extra Form aufpoppen zu lassen, und dann "Übernehmen" und "Schließen" klicksen zu müssen, statt eine übersichtliche Ansicht zu gestalten, in die man die erforderlichen Werte einfach eintragen kann.
Ich hab eine mehr oder weniger kleine Beispiel-Anwendung gebastelt (mehr: Designer-Code, weniger: User-Code).
Mit Passwort-Dialog (modaler Dialog), und dann eine Art Warenkorb auf einem TabControl (also Eingabe-Ergebnis-Muster).
Die Kommunikation mit dem Passwort-Dialog ist abgehandelt in folgenden Zeilen:
private void frmMain_Load(object sender, EventArgs e) {
string KundeID;
while (true) {
using (PasswortForm Frm = new PasswortForm()) {
if (Frm.ShowDialog(this) != DialogResult.OK) {
this.Close();
return;
}
KundeID = Frm.Password;
}
if (KundeTableAdapter.ValidateKundeID(KundeID).Value > 0) break;
MessageBox.Show(this, "Falsch!");
}
//hier gehts dann wirklich los
Und auf dem PasswortForm die Property Password:
public string Password {
get { return this.textBox1.Text; }
}
Zur eigentlichen Form2Form-Kommunikation gibt das Sample codemäßig nicht viel her, da sie sich erübrigt hat.
Die Laufzeit kann vllt. illustrieren, wie eine recht anspruchsvolle und (hoffentlich) ergonomische Funktionalität auf einem Form untergebracht sein kann.