tutorial zu eventhandler

H2SO4

Grünschnabel
hi,

an sich ist die frage zwar etwas blöd aber langsam glaube ich ich bin es auch.
EventHandler sind ja nun eigentlich nicht so schwierig und werden auch häufig gebraucht in c#.net
Nur irgendwie stelle ich mir hier zu doof an. Kann mir jemand ein gutes tutroial oder sonstige anleitung nennen die ich lesen kann um dann zu sagen, ich habs kapiert? Speziel solche themen wie. Wie deffiniere ich welche, wie rufe ich sie auf. Was muss ich übergeben, was und wie kann ich zurückgeben usw. auch wie sich das genau mit dem object und dem anderen gram hinten in der klammer verhält. Wenn da jemand was kennt, währs echt cool.
 
Hallo.

Wie du schon gesagt hast werden EventHandler recht häufig benutzt.

Wie deffiniere ich welche

Eigene Events meinst du?

Dazu brauchst du zuerst einen Delegate, welcher bestimmt wie die eigentlichen "EventHandler" auszusehen haben.

Guter Stil ist es, void als Rückgabewert zu verwenden und 2 Parameter zu benutzen. Der erste ist vom Typ object und verweist auf das Objekt, welche das Event ausgelöst hat. (Beim Aufruf einfach this).

Der 2. Typ sollte von EventArgs abgeleitet sein, und ist für die Bereitstellung von Daten gedacht.

In .net/C# 2.0 hat mans mit den Generics recht gut, denn es gibt einen generischen Delegate bei welchem man nur noch den EventArgs-Typ angeben muss.

Auf jedenfall brauchst du als erstes einen EventArgs-Typ, ausser du willst keine spiellen Daten übergeben, dann reicht einfach die EventArgs Klasse.

Hier ein einfaches Beispiel, mit einer einzigen Info die zudem noch von selbst im Konstruktor gesetzt wird.
C#:
public class CustomEventArgs : EventArgs
{
	private readonly DateTime date;

	public CustomEventArgs()
	{
		date = DateTime.Now;
	}

	public DateTime Date { get { return date; } }
}

Diese Klasse könntest jetzt mit dem generischen Handler benutzen.
Wenn du diesen nicht benutzen kannst oder willst, musst du zuerst einen eigenen Delegate erstellen. Der Name sollte auf "EventHandler" enden.

C#:
public delegate void CustomEventHandler(object sender, CustomEventArgs cea);

Um nun ein verwendbares Event zu haben, müssen wir dieses nun noch innerhalb einer Klase erstellen.

C#:
public event EventHandler<CustomEventArgs> EventFired;
public event CustomEventHandler AnotherEventFired;

Hier einmal mit dem generischen EventHandler, und einmal mit unserem eigenen.

C#:
public event EventHandler<CustomEventArgs> EventFired;
public event CustomEventHandler AnotherEventFired;

Das feuern eines Events ist ganz einfach, schaut aus wie als wenn du eine Methode aufrufen würdest, und die benötigten Parameter gibt der verwendete Delegate an. (Also einmale in object, und einmal der EventArgs Typ)

Allerdings solltest du vor dem Aufruf des Events auf null prüfen, damits zu keinem Fehler kommt, falls kein EventHandler registriert ist.

Diese überprüfung kannst elegant in eine eigene Methode auslagern..

C#:
protected virtual void OnEventFired(CustomEventArgs cea)
{
	if (EventFired != null)
		EventFired(this, cea);
}

protected virtual void OnAnotherEventFired(CustomEventArgs cea)
{
	if (AnotherEventFired != null)
		AnotherEventFired(this, cea);
}

Wie man einen EventHandler registriert solltest ja schon wissen, aber hier ein kleines Beispiel:

C#:
EventTest test = new EventTest();
test.EventFired += new EventHandler<CustomEventArgs>(test_EventFired);
...
private void test_EventFired(object sender, CustomEventArgs e)
{
// ...
}

Am Ende des Postings findest noch den gesamten Code für die Klasse mit den beiden Events. ;)

Für ein bessers Verständniss solltest dich noch informieren was "delegates" genau sind..

Noch ein paar Links in die MSDN:

Ereignisse (C#-Programmierhandbuch)
delegate (C#-Referenz)
Delegaten (C#-Programmierhandbuch)

Ich hoff das hat dir ein wenig weitergeholfen, wenn nicht frag halt nochmal nach.

lg.. :)

C#:
public class CustomEventArgs : EventArgs
{
	private readonly DateTime date;

	public CustomEventArgs()
	{
		date = DateTime.Now;
	}

	public DateTime Date { get { return date; } }
}

public class EventTest
{
	public delegate void CustomEventHandler(object sender, CustomEventArgs cea);

	public event EventHandler<CustomEventArgs> EventFired;
	public event CustomEventHandler AnotherEventFired;

	protected virtual void OnEventFired(CustomEventArgs cea)
	{
		if (EventFired != null)
			EventFired(this, cea);
	}

	protected virtual void OnAnotherEventFired(CustomEventArgs cea)
	{
		if (AnotherEventFired != null)
			AnotherEventFired(this, cea);
	}

	public void FireEvents()
	{
		CustomEventArgs cea = new CustomEventArgs();

		OnEventFired(cea);
		OnAnotherEventFired(cea);
	}
}
 

Neue Beiträge

Zurück