如何从另一个类中的计时器事件处理程序更新标签文本?

时间:2013-07-19 12:42:11

标签: c# string forms timer label

我的表单中有一个名为labelTime的标签。 在另一个名为TimeCalculate的类中,我有TimerTimer_tick事件处理程序。 在这个类中,我还有一个函数GetTime(),它以字符串格式返回时间。 我希望每个labelTime都会在Timer_tick中显示此字符串。 有没有办法实现这个目标?

public void MyTimer(Label o_TimeLabel) 
{
  Timer Clock = new Timer(); 
  Clock.Tag = o_TimeLabel.Text; 
  Clock.Interval = 1000; Clock.Start(); 
  Clock.Tick += new EventHandler(Timer_Tick); 
} 

private void Timer_Tick(object sender, EventArgs eArgs) 
{ 
  if (sender == Clock) 
  { 
    //LabelTime.Text = GetTime(); <-- I want this to work! 
  } 
}

3 个答案:

答案 0 :(得分:1)

您需要Timer和事件的格式与Label

相同

修改

既然你已经这样做了,你需要;

将Timer对象声明为构造函数外部的实例变量,并在构造函数中初始化它 不必担心测试'sender == Clock' 并且在此类中也有一个Label实例对象,将其设置为您在构造函数中作为参数传递的Label。

    Timer Clock;
    Label LabelTime;
    public void MyTimer(Label o_TimeLabel) 
    {
      LabelTime = o_TimeLabel;
      Clock = new Timer(); 
      Clock.Tag = o_TimeLabel.Text; 
      Clock.Interval = 1000;
      Clock.Start(); 
      Clock.Tick += new EventHandler(Timer_Tick); 
    } 

    private void Timer_Tick(object sender, EventArgs eArgs) 
    { 
      LabelTime.Text = GetTime(); // For your custom time
    }

答案 1 :(得分:1)

Rebecca在您的Time_Tick活动中,您可以执行以下操作

private void Timer_Tick(object sender, EventArgs e)
{      
  lblTime.Text = DateTime.Now.ToString("hh:mm:ss");
}

答案 2 :(得分:1)

TimerTimer_Tick事件不需要与Label位于同一个类中,您可以创建一个简单的自定义事件来发布/订阅Timer_Tick } event

您的TimeCalculate班级:

namespace StackOverflow.WinForms
{
    using System;
    using System.Windows.Forms;

    public class TimeCalculate
    {
        private Timer timer;

        private string theTime;
        public string TheTime
        {
            get
            {
                return theTime;
            }
            set
            {
                theTime = value;
                OnTheTimeChanged(this.theTime);
            }
        }

        public TimeCalculate()
        {
            timer = new Timer();
            timer.Tick += new EventHandler(Timer_Tick);
            timer.Interval = 1000;
            timer.Start();
        }

        private void Timer_Tick(object sender, EventArgs e)
        {
            TheTime = DateTime.UtcNow.ToString("dd/mm/yyyy HH:mm:ss");
        }

        public delegate void TimerTickHandler(string newTime);
        public event TimerTickHandler TheTimeChanged;

        protected void OnTheTimeChanged(string newTime)
        {
            if (TheTimeChanged != null)
            {
                TheTimeChanged(newTime);
            }
        }
    }
}

上面极其简化的示例显示了在delegate event对象事件触发时如何使用publishTimer_TickTimer通知。< / p>

Timer_Tick事件触发时需要通知的任何对象(I.E.您的时间更新)只需要subscribe到自定义事件发布者:

namespace StackOverflow.WinForms
{
    using System.Windows.Forms;

    public partial class Form1 : Form
    {
        private TimeCalculate timeCalculate;

        public Form1()
        {
            InitializeComponent();
            this.timeCalculate = new TimeCalculate();
            this.timeCalculate.TheTimeChanged += new TimeCalculate.TimerTickHandler(TimeHasChanged);

        }

        protected void TimeHasChanged(string newTime)
        {
            this.txtTheTime.Text = newTime;
        }
    }
}

我们在订阅TimeCalcualte事件之前创建TimerTickHandler类的实例,指定处理通知的方法(TimeHasChanged)。请注意,txtTheTime是我在表单上提供TextBox的名称。