2009-12-21 13 views
10

Ich bin ein bisschen verwirrt. Ich weiß, dass ich eine von EventArgs abgeleitete Klasse erstellen kann, um benutzerdefinierte Ereignisdaten zu erhalten. Kann ich die EventArgs der Basisklasse irgendwie einsetzen? Wie beim Anklicken der Maustaste gibt es in der Teilnehmermethode immer den Parameter "EventArgs e". Kann ich irgendwie die Methode erstellen, die Daten auf diese Weise weitergibt, ich meine, sie werden in den Basis-Eventargs weitergegeben?Es ist möglich, Daten an EventArgs zu übergeben, ohne eine abgeleitete Klasse zu erstellen?

+0

Wenn Sie versuchen, Daten auf Huckepack zu übertragen Ein Mausklick-Ereignis, das nicht nur nicht möglich ist, sondern auch anzeigt, dass ein Problem mit Ihrem Design vorliegt. – Will

+1

Gibt es eine Chance zu erklären, warum dies notwendigerweise ein Designproblem ist? Kann ein Menü nicht semantisch als ein Stapel von Schaltflächen angesehen werden, dessen zugeordnetes Ereignis es erlaubt zu fragen, welche "Schaltfläche" tatsächlich im Menü gedrückt wurde? Mit welchem ​​Designprinzip brechen Sie, indem Sie zusätzliche Informationen zusammen mit einem Knopfdruck weitergeben möchten? – Patrick

Antwort

3

Ist es möglich, einfach den EventArgs Datentyp rough zu verwenden? Absolut. Laut MSDN:

This class contains no event data; it is used by events that do not pass state information to an event handler when an event is raised. If the event handler requires state information, the application must derive a class from this class to hold the data.

http://msdn.microsoft.com/en-us/library/system.eventargs.aspx

private event TestEventEventHandler TestEvent; 
    private delegate void TestEventEventHandler(EventArgs e); 

    private void button1_Click(object sender, EventArgs e) 
    { 
     TestEvent += TestEventHandler; 
     if (TestEvent != null) 
     { 
      TestEvent(new EventArgs()); 
     } 
    } 
    private void TestEventHandler(EventArgs e) 
    { 
     System.Diagnostics.Trace.WriteLine("hi"); 
    } 

Sollten Sie jemals tun? Nicht aus irgendeinem Grund kann ich denken, wenn. Wenn Sie Ihre eigenen Klicks erstellen möchten, können Sie einfach die MouseEventArgs auf Ihrem eigenen instanziiert auch:

MouseEventArgs m = new MouseEventArgs(System.Windows.Forms.MouseButtons.Left, 1, 42, 42, 1); 
+4

Sie können auch EventArgs.Empty verwenden http://msdn.microsoft.com/en-us/library/system.eventargs.empty.aspx – Gavin

+0

Ist es ein Tippfehler? 'TestEventEventHandler'. Es gibt zwei Ereigniswörter. Aber im Code. Sie haben 'TestEventHandler' verwendet. – Bigeyes

5

Nein. Die EventArgs-Basisklasse ist nur eine Möglichkeit, um einige Standard-Event-Delegate-Typen zuzulassen. Um Daten an einen Handler zu übergeben, müssen Sie EventArgs ableiten. Sie könnten stattdessen das Absenderarg verwenden, aber das sollte wirklich das Objekt sein, das das Ereignis ausgelöst hat.

13

Sie können die EventArgs-Klasse durch die generische Typen Ansatz. In diesem Beispiel werde ich die Rect-Klasse mit als Rückgabetyp verwenden:

public EventHandler<Rect> SizeRectChanged; 

das das Ereignis auslöst:

if(SizeRectChanged != null){ 
    Rect r = new Rect(0,0,0,0); 
    SizeRectChanged(this,r); 
} 

das Ereignis Zuhören:

anyElement.SizeRectChanged += OnSizeRectChanged; 

public void OnSizeRectChanged(object sender, Rect e){ 
    //TODO abything using the Rect class 
    e.Left = e.Top = e.Width = e.Height = 50; 
} 

also nicht brauchen Um neue Ereignisklassen oder -delegaten zu erstellen, erstellen Sie einfach einen EventHandler, der den spezifischen Typ T übergibt.

+1

Das sieht falsch aus. Das [MSDN-Website-Beispiel] (http://msdn.microsoft.com/en-us/library/db0etb8x%28v=vs.110%29.aspx) zeigt, dass Rect oder TEventArg von EventArgs erben muss. Es sei denn, ich habe etwas falsch verstanden. –

+1

Thomas, ich fand das auch verwirrend. Aber Jupis Vorschlag funktionierte für mich. –

+0

Wow ... ich wünschte, ich hätte das vor langer Zeit gewusst. Ich nahm immer an, dass, wenn Sie EventHandler erklärten, dass T von EventArgs abgeleitet werden muss. Wenn ich zum Beispiel eine Zeichenfolge mit meinem Ereignis senden wollte, würde ich eine neue Klasse StringEventArgs erstellen, die von EventArgs subclassiert wurde. Das MSDN-Dokument, das von Thomas Lann verlinkt wird, sagt sicher "Sein zweiter Parameter ist vom Typ EventArgs abgeleitet und enthält die Ereignisdaten" was für die meisten Leser bedeuten würde, dass Sie keine beliebige Klasse verwenden können. Aber der Compiler scheint keinen EventHandler zu stören, und das funktioniert ganz gut, soweit ich das beurteilen kann. – uglycoyote

Verwandte Themen