Hallo.
Ist es möglich einem Event eine Variable mit zu übergebn?
Ich habe wie in [FAQ] Eigenen Event definieren / Information zu Events beschrieben meinen Eventhandler implementiert:
public event EventHandler NewCourseModule;
protected virtual void OnNewCourseModule(EventArgs e)
{
EventHandler newCourseModule = NewCourseModule;
if (newCourseModule != null)
{
newCourseModule(this, e);
}
}
und wird so ausgeloest:
OnNewCourseModule(EventArgs.Empty);
Nun kennt das Objekt, welches das Event abonniert hat aber nur von wem es kam und welches EventArg uebergeben wurde. Da das Event imm mit EventArgs.Empty ausgeloest wird, ist da natürlich nicht viel drin. Leider gibt es aber nur EventArgs.Empty.
Kann ich in dieses EventArgs.Empty irgendwie werte von Variablen speichern?
Ich nehme dafür meist eine generische EventArgs-Klasse, mit der man auf die Schnelle beliebige Argumente übergeben kann
public class EventArgs<T> : EventArgs
{
public T Data { get; set; }
public EventArgs(T data)
{
Data = data;
}
}
Entsprechender EventHandler dazu sähe dann so aus
public event EventHandler<EventArgs<string>> TestEvent
...
if (TestEvent != null)
{
TestEvent(this, new EventArgs<string>("Test"));
}
Im Ergeignis an sich, kannst Du dann einfach über Data drauf zugreifen
void Form1_TestEvent(object sender, EventArgs<string> e)
{
MessageBox.Show(e.Data);
}
Wenn Du mehrere Argumente brauchst, kannst Du sie in eine ensptr. Klasse packen und die genauso übergeben.
Hallo exaveal,
wie man bei Events eigene Argumente übergibt, steht aber schon in dem FAQ-Beitrag, den du verlinkt hast. Du musst das überlesen haben. Die dort beschriebene Lösung bedeutet zwar vielleicht etwas mehr Code, ist dafür aber aussagekräftiger und besser als die Verwendung einer generischen Klasse, bei der die Property zwangsläufig immer unspezifisch heißt (im Beispiel: Data).
herbivore
Hallo!
Ich würde von der generischen Lösung in jedem Fall absehen. Der Sinn von spezifischen EventArgs ist ja auch, dass man später die übergebenen Daten erweitern kann. Wenn du nun das generische Data hast, was z.B. bisher ein string ist und später noch ein int dazu soll, dann kannst du das EventArgs<string> eben nicht erweitern. Ein Custom-Object hingegen schon.
Viele Grüße,
Uwe