Windows Forms: Kommunikation zwischen Formularen

Wenn wir eine Anwendung mit mehreren Formularen haben, gibt es das Problem, dass wir Daten oder Informationen von einem zum anderen Formular übertragen müssen. Wir erklären dies an Hand eines Beispiels: Formular 1 und Formular 2 hat jeweils ein Textfeld. Im Formular 1 geben wir einen Text ein und klicken auf einen Button, wodurch Formular 2 geöffnet wird und der Text, welcher in Formular 1 eingegeben wurde, im Textfeld erscheint. Doch wie funktioniert das? Wir könnten dem Textfeld-Steuerelement den Zugriffsmodifizierer public zuweisen. Dies wollen wir aber nicht machen, da es ein schlechter Programmierstil ist, Variablen public zu machen, wie wir ja bereits im Objektorientierungs-Kapitel erklärt haben. Also erstellen wir eine Eigenschaft, welche auf die TextBox zugreift. Somit können wir den string schon Mal von Formular 1 zu Formular 2 übertragen. Im Formular 2 gibt es ebenfalls einen Button, mit welchem wir das aktuelle Fenster schließen und den Text wieder zurück in das Formular 1 übertragen wollen. Hierfür registrieren wir das FormClosing-Event von Formular 2 über das Formular 1. Nun können wir über die Eigenschaft, welche wir im Formular 2 erstellt haben, den Text des Textfeldes abrufen. Doch es gibt ein Problem: Wir übernehmen den Text auch wenn wir das Fenster über den Schließen-Button des Fensters selbst (Programmleiste) schließen. Dies ist jedoch nicht gewünscht. Deshalb haben wir im Formular 2 noch eine weitere Eigenschaft (Datentyp bool) eingeführt, mit welcher wir prüfen können, ob das Fenster über den Button geschlossen wurde (siehe Beispiel).
Zum Öffnen eines Formulars können wir die Funktion Show() oder ShowDialog() aufrufen. Wird ShowDialog() verwendet, so können wir nicht zu dem öffnenden Fenster zurückkehren, das Fenster ist modal. Um ein Formular wieder zu schließen, können wir die Funktion Hide() oder Close() verwenden. Wird die Close()-Funktion aufgerufen, so wird das Formular zerstört und darf somit anschließend nicht mehr mit Show() oder ShowDialog() aufgerufen werden. Wird Hide() verwendet, so können wir nach dem Schließen des Fensters, das Formular erneut öffnen. Dabei bleiben Eingaben in Textfeldern etc. enthalten, da das Formular nicht geschlossen sondern nur „versteckt“ wird.

Form1.cs

private void buttonFormular2Öffnen_Click(object sender, EventArgs e)
{
	Form2 oForm = new Form2();
	oForm.sTextEingabe = textBoxEingabe.Text;
	oForm.FormClosing += new FormClosingEventHandler(Form2_FormClosing);
	oForm.Show();       // falls Dialog angezeigt werden sollte, kann auch ShowDialog() aufgerufen werden
}

private void Form2_FormClosing(object sender, FormClosingEventArgs e)
{
	Form2 oForm = (Form2)sender;

	// Prüfen ob Fenster durch den Klick auf den Button geschlossen wurde
	if (oForm.bEingabeButton)
		textBoxEingabe.Text = oForm.sTextEingabe;
}

Form2.cs
public bool bEingabeButton { get; set; }    // falls true, dann muss sTextEingabe in Form 1 übernommen werden
public string sTextEingabe
{
	get
	{
		return textBoxEingabe.Text;
	}
	set
	{
		textBoxEingabe.Text = value;
	}
}

public Form2()
{
	InitializeComponent();
	bEingabeButton = false;
}

private void buttonZurückZuFormular1_Click(object sender, EventArgs e)
{
	// Flag setzen und Fenster schließen (Form 1 hat das Event FormClosing registriert)
	bEingabeButton = true;
	Close();
}
Download

LinksRechts