【问题标题】:Passing Custom event arguments to timer_TICK event将自定义事件参数传递给 timer_TICK 事件
【发布时间】:2010-10-24 21:22:19
【问题描述】:

我有课

//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。 最好的方法是什么?

【问题讨论】:

    标签: c# events


    【解决方案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】:

      只需将您的参数附加到您的“标签”属性 计时器对象 - 任何其他“可能”都是矫枉过正:

      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
      }
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          我不确定您要达到的目标。 Timer.Tick 事件总是返回纯 EventArgs,因为它是从 .Net 框架内驱动的。您想从您在 Groupby 类中定义的事件中返回 GroupFieldArgs 吗?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-01-05
            • 1970-01-01
            • 2019-09-25
            • 1970-01-01
            • 1970-01-01
            • 2013-05-31
            相关资源
            最近更新 更多