如何从不同类中的计时器事件处理程序更新标签文本
本文关键字:程序 事件处理 更新 标签 文本 计时器 同类 | 更新日期: 2023-09-27 18:23:52
我有一个表单,其中有一个名为labelTime
的标签。在另一个名为TimeCalculate
的类中,我有一个带有Timer_tick
事件处理程序的Timer
。在这个类中,我还有一个函数GetTime()
,它以字符串格式返回时间。我希望此字符串在每个Timer_tick
的labelTime
中出现。有办法做到这一点吗?
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!
}
}
Timer
和Timer_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
对象事件触发时,如何使用delegate
和event
到publish
作为通知。
当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
}