Arbeiten mit Events in C#

(http://www.zdnet.de/magazin/20000858/arbeiten-mit-events-in-c.htm)

von Harold Davis, Builder.com, 29. Oktober 2002

Ein Event ist ein Klassenelement, das durch einen Klick auf einen Button oder eine ähnliche Aktion aktiviert wird. Erfahren Sie die grundlegenden Aspekte beim Arbeiten mit Events in einem Windows-Formular.

Events können fast sämtliche Antworten zu jedem bestimmten Objekt abschießen. Event-Methoden erfassen Eingaben wie z.B. Buttonklicks und können diese Aktionen für alle Methoden berichten.

In diesem Teil unserer Einführung zu C# werden die grundlegenden Aspekte beim Arbeiten mit Events in einem Windows-Formular besprochen und erklärt, wie man Prozeduren zum Abwickeln eines Form-Events, auch Eventhandler genannt, mit Visual Studio hinzufügen kann. Weiterhin wird der einer Event-Methode zugrundeliegende Code untersucht, der es ermöglicht, ein Event ohne VDE (Visual Development Environment) ausschließlich im Code-Editor hinzuzufügen.

Was ist ein Event?

Ein Event ist ein Platzhalter für Code, der ausgeführt wird, wenn das Event ausgelöst bzw. aktiviert wird. Events werden durch eine Aktion des Benutzers, durch Programmcode oder vom System ausgelöst.

Aus einer formelleren Perspektive - und der Anschauungsweise von C# - betrachtet, ist ein Event ein Objektelement oder, um genauer zu sein, eine Methode. (Dieser Artikel behandelt in erster Linie Windows-Formen, doch sind die hier besprochenen Grundsätze auch auf Objekte wie z.B. Buttons und andere Steuerelemente anwendbar.)

Die Event-Methode bzw. der Event-Prozess besteht aus dem Namen des Prozesses gefolgt von zwei Argumenten. Das erste Argument bzw. der Parameter ist das Objekt, welches das Event auslöst; das zweite ist der Argument-Typ System.EventArgs. Außerdem muss die Event-Methode mit dem +=-Operator als Delegat (eine Methode, die stellvertretend für eine andere Methode ausgeführt wird) eingebunden werden. Die Funktion += als additiver Zuweisungsoperator braucht wahrscheinlich nicht erklärt zu werden.

Die Codierung eines Klick-Events einer Form für eine mit Form1 bezeichnete Formklasse macht dies deutlicher (dieser Code ist in der Methode InitializeComponent im "versteckten" Bereich des vom Windows Form Designer generierten Code zu finden):


this.Click += new System.EventHandler(this.Form1_Click);

Das diesbezügliche Framework für die Event-Methode ist:


private void Form1_Click(object sender, System.EventArgs e) {

}

Ein Event lässt sich problemlos aus einem anderen Event heraus aufrufen. Der nachstehende Code zeigt zum Beispiel eine Meldung an, wenn das Eingabe-Event von Button1 ausgelöst wird:


private void button1_Enter(object sender, System.EventArgs e) {
MessageBox.Show ("The Button's Enter event has been fired",
"C# for Newbies", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);

}

Um das Eingabe-Event von Button1 aus einem anderen Event auszulösen, muss der Methode Button1_Enter im anderen Event ein Aufruf hinzugefügt werden. Dieser Code würde in einem DoubleClick-Event der Form so aussehen:


private void Form1_DoubleClick(object sender, System.
EventArgs e) {
button1_Enter (sender, e);
}

Wenn nun auf die Form doppelgeklickt wird, erscheint mit dem Auslösen des Eingabe-Events des Buttons die in Abbildung A gezeigte Meldung.

Abbildung A
Abbildung A: Events eignen sich hervorragend für Meldungen wie diese.

Sollte System.EventArgs nicht für die Übergabe des Events zur Verfügung stehen, da es zum Beispiel außerhalb eines Events aufgerufen wird, ist dies kein Problem. Nachstehend ist beschrieben, wie dies erstellt und eine Event-Methode aufgerufen werden kann:


System.EventArgs g = new System.EventArgs();
button1_Enter (this, g);

Visual Studio IDE für VB.NET bietet eine Dropdown-Liste mit den Objekten und Prozessen des CodeEditor zur automatischen Generierung von Event-Gerüsten. In C# dagegen werden mit einem speziellen Interface Event-Codegerüste automatisch generiert. Um dieses Interface nutzen zu können, muss diese Form in ihrem Designer aktiviert sein (selbstverständlich kann dieses Interface auch für andere in der Form eingesetzte Objekte wie z.B. Buttons benutzt werden). Danach wird das Eigenschaftsfenster geöffnet und mit einem Klick auf das Blitzsymbol auf der Symbolleiste des Eigenschaftsfensters die Registerkarte Events geöffnet.

Die Registerkarte Events im Eigenschaftsfenster kann auf drei Arten genutzt werden:

Abbildung B Abbildung B: Ein Event kann im Dropdown-Menü in der rechten Spalte einer bestehenden Klassenmethode zugeordnet werden. (Abbildung vergrößern)

Betrachten wir die erste Alternative einmal näher. Durch Doppelklick auf das Klick-Event in der linken Spalte wird der folgende Code generiert:


this.Click += new System.EventHandler(this.Form1_Click);
...
private void Form1_Click(object sender, System.EventArgs e) {

}

Code, der eine Meldung für die Event-Methode anzeigt, lässt sich ganz einfach wie folgt hinzufügen:


private void Form1_Click(object sender, System.EventArgs e) {
MessageBox.Show ("I've been clicked!",
"C# for Newbies", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}

Erwartungsgemäß wird mit einem Klick auf die Form die in Abbildung C abgebildete Meldung angezeigt.

Abbildung C
Abbildung C: Dieses Event-Beispiel zeigt diese Nachricht an.


Wie bereits erwähnt, ist es nicht erforderlich, dass man den vorgegebenen Namen für die Event-Methode (wie z.B. Form1_Click) benutzt. Der Name wird lediglich zum Nutzen des Anwenders generiert, und man kann ebenso einen anderen Eventhandler aus der Dropdown-Liste wählen.

Es ist wichtig zu beachten, dass eine Event-Methode mehrere Events abwickeln kann. Dabei müssen die Events nicht unbedingt von demselben Objekt ausgelöst werden. Auf diese Weise lässt sich die Verarbeitung einer bestimmten Reihe von Events mühelos zusammenfassen - z.B. alle Klick-Events für eine Reihe verschiedener Steuerelemente. Der Senderparameter in der Event-Methode kann genutzt werden um festzustellen, welches Objekt das Event ausgelöst hat, und das Event entsprechend abwickeln. (Die Nutzung des Senderparameters auf diese Weise kann Type Casting erfordern, was in künftigen Artikeln näher erläutert wird.)

Das Events-Feld kann auch dazu benutzt werden, um die auf ein bestimmtes Event antwortende Methode zu benennen. Hierzu wird der gewünschte Name in der rechten Spalte wie in Abbildung D gezeigt eingegeben

Abbildung D
Abbildung D: Die vorgegebenen Namen von Events können überschrieben werden.

Wird das SizeChanged-Event der Form als IcanNameThisWhatIWant bezeichnet, wird das folgende Gerüst für das SizeChanged-Event generiert:


this.SizeChanged += new System.EventHandler
(this.ICanNameThisWhatIWant);
...
private void ICanNameThisWhatIWant(object sender,
System.EventArgs e) {
}

Auch hier lässt sich Code, der eine Meldung anzeigt (oder einen anderen Task ausführt), der Event-Methode einfach hinzufügen:


private void ICanNameThisWhatIWant(object sender,
System.EventArgs e) {
MessageBox.Show ("Named my way!",
"C# für Einsteiger", MessageBoxButtons.OK,
MessageBoxIcon.Exclamation);
}

Wird das Event nach Installation dieses Codes nun durch ein SizeChanged-Event ausgelöst, wird der Code in der IcanNameThisWhatIWant-Methode ausgeführt und die gewünschte Meldung angezeigt.

Einblick in das Innenleben von Events

In diesem Artikel wurde der von der Entwicklungsumgebung generierte Code hervorgehoben. Weshalb eigentlich? Man sollte den Code, auf dem Events basieren, verstehen. Die VDE-Entwicklungsumgebung bietet nicht gerade viel auf diesem Gebiet, und oftmals ist es einfacher, die Registerkarte Events zu ignorieren und mit Code zu arbeiten. Warum sich mit der Autogenerierung herumschlagen, wenn man die Grundlagen des Codes beherrscht?

All dies ist ziemlich nützlich, wenn man mit den üblichen Events auskommt, die mit Objekten wie z.B. Forms und Buttons mitgeliefert werden. Was aber, wenn man Klassen mit eigenen Events erstellen möchte? Wie werden maßgeschneiderte Events ausgelöst? Wo ist der Code für diese Events unterzubringen? Die Antworten auf diese Fragen sind im zweiten Teil dieser Serie zu finden.