如何从不同类中的计时器事件处理程序更新标签文本

本文关键字:程序 事件处理 更新 标签 文本 计时器 同类 | 更新日期: 2023-09-27 18:23:52

我有一个表单,其中有一个名为labelTime的标签。在另一个名为TimeCalculate的类中,我有一个带有Timer_tick事件处理程序的Timer。在这个类中,我还有一个函数GetTime(),它以字符串格式返回时间。我希望此字符串在每个Timer_ticklabelTime中出现。有办法做到这一点吗?

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

如何从不同类中的计时器事件处理程序更新标签文本

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

上面极其简化的示例显示了当Timer_Tick Timer对象事件触发时,如何使用delegateeventpublish作为通知。

Timer_Tick事件触发时需要通知的任何对象(即,您的时间已更新)只需将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;
        }
    }
}

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

Rebecca在您的Time_Tick事件中,您可以执行以下

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

您需要与标签相同形式的计时器及其事件

编辑

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

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