2009-05-08 5 views
0

Ich habe KlassePassing Benutzerdefinierte Ereignisargumente zu timer_TICK Ereignis

//Create GroupFieldArgs as an EventArgs 
    public class GroupFieldArgs : EventArgs 
    { 
     private string groupName = string.Empty; 
     private int aggregateValue = 0; 
     //Get the fieldName 
     public string GroupName 
     { 
      set { groupName = value; } 
      get { return groupName; } 
     } 
     //Get the aggregate value 
     public int AggregateValue 
     { 
      set { aggregateValue = value; } 
      get { return aggregateValue; } 
     } 
    } 

ich eine andere Klasse, die eine Event-Handler-I

public class Groupby 
{ 
public event EventHandler eh; 
} 

Schließlich haben Timer auf meiner Form erstellt, die Timer_TICK Ereignis hat. Ich möchte GroupFieldArgs in Timer_TICK-Ereignis übergeben. Was ist der beste Weg, es zu tun?

Antwort

0

Ich bin mir nicht sicher, was Sie erreichen möchten. Das Timer.Tick-Ereignis gibt immer einfache EventArgs zurück, da es aus dem .NET-Framework stammt. Möchten Sie GroupFieldArgs von dem Ereignis zurückgeben, das Sie in der Klasse Groupby definiert haben?

1

Sie könnten die Standard-Timer-Klasse ableiten und eine Eigenschaft hinzufügen, mit der Sie Ihre benutzerdefinierten Ereignisargs injizieren können. Ihre neue Klasse könnte das Elapsed-Ereignis intern behandeln und ein neues Ereignis verfügbar machen, das Ihre EventArgs enthält.

namespace Test 
{ 
    class MyTimer : System.Timers.Timer 
    { 
     public EventArgs MyEventArgs { get; set; } 

     public MyTimer() 
     { 
      this.Elapsed += new System.Timers.ElapsedEventHandler(MyTimer_Elapsed); 
     } 

     void MyTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
     { 
      if (MyEventArgs != null) 
       OnMyTimerElapsed(MyEventArgs); 
      else 
       OnMyTimerElapsed(e); 
     } 

     protected virtual void OnMyTimerElapsed(EventArgs ea) 
     { 
      if (MyTimerElapsed != null) 
      { 
       MyTimerElapsed(this, ea); 
      } 
     } 

     public event EventHandler MyTimerElapsed; 
    } 
} 
0

Wie Grzenio darauf hingewiesen hat, wird es immer die gleiche Art von Ereignis generieren.

Das heißt, können Sie ein Objekt, dass „hüpft“ das Ereignis zu seiner beabsichtigten Empfänger ...

public class GroupFieldArgSender 
{ 
    public string GroupName { get; set; } 
    public int AggregateValue { get; set; } 

    public void RebroadcastEventWithRequiredData(object sender, EventArgs e) 
    { 
    if (GroupFieldEvent != null) 
    { 
     GroupFieldEvent(sender, new GroupFieldEvent 
     { GroupName = GroupName, AggregateValue = AggregateValue }); 
    } 
    } 

    public event EventHandler<GroupFieldEventArgs> GroupFieldEvent; 
} 

Dann überweisen Sie die Timer-Tick-Ereignis der RebroadcastEventWithRequiredData Methode erstellen.

6

Bringen Sie einfach Ihre arg (s) zum "Tag" Eigenschaft Ihres Timer-Objekt - alles andere "könnte" zu viel des Guten:

Timer SomeTimer; 
void SomeMethod() 
{ 
    SomeTimer = new Timer(); 
    SomeTimer.Tag = "myArgString"; // or struct, class, list, etc.. 
    SomeTimer.Tick += new EventHandler(SomeTimer_Tick); 
    SomeTimer.Start(); 
} 

void SomeTimer_Tick(object sender, EventArgs e) 
{ 
    string s = ((Timer)sender).Tag; // SomeTimer.Tag 
} 
Verwandte Themen