Laden...

Event Argumente uebergeben

Erstellt von exaveal vor 13 Jahren Letzter Beitrag vor 13 Jahren 4.720 Views
E
exaveal Themenstarter:in
96 Beiträge seit 2010
vor 13 Jahren
Event Argumente uebergeben

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?

K
62 Beiträge seit 2009
vor 13 Jahren

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.

E
exaveal Themenstarter:in
96 Beiträge seit 2010
vor 13 Jahren

Ah perfekt.

Genau sowas hab ich gesucht.
Danke!

49.485 Beiträge seit 2005
vor 13 Jahren

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

U
282 Beiträge seit 2008
vor 13 Jahren

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