将自定义事件参数传递给timer_TICK事件

时间:2009-05-08 19:14:39

标签: c# events

我有课

//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; }
        }
    }

我有另一个创建事件处理程序的类

public class Groupby
{
 public event EventHandler eh;
}

最后我的表单上有Timer,它有Timer_TICK事件。 我想在Timer_TICK事件中传递GroupFieldArgs。 最好的方法是什么?

4 个答案:

答案 0 :(得分:6)

只需将您的arg附加到您的“Tag”属性即可 计时器对象 - 其他任何“可能”都是过度的:

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
}

答案 1 :(得分:1)

您可以继承标准计时器类并添加一个属性,您可以在其中注入自定义事件参数。您的新课程可以在内部处理Elapsed事件,并公开一个新事件,该事件将携带您的EventArgs。

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;
    }
}

答案 2 :(得分:0)

我不确定你想要实现的目标。 Timer.Tick事件总是返回简单的EventArgs,因为它是从.Net框架内驱动的。是否要从Groupby类中定义的事件返回GroupFieldArgs?

答案 3 :(得分:0)

正如Grzenio指出的那样,它总会产生同样的事件。

也就是说,您可以创建一个将事件“弹回”给预期收件人的对象......

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;
}

然后将计时器tick事件连接到RebroadcastEventWithRequiredData方法。