C# 通过单击按钮向计时器添加时间
我设置了计时器,但无法通过按钮分别添加10秒、1分钟和10分钟来计算如何添加时间。我不确定我是否成功地让它正确地倒计时,因为我从一个倒计时的计时器复制了代码,并试图反转它。任何帮助都将不胜感激。 这是我的密码:C# 通过单击按钮向计时器添加时间,c#,winforms,visual-studio,C#,Winforms,Visual Studio,我设置了计时器,但无法通过按钮分别添加10秒、1分钟和10分钟来计算如何添加时间。我不确定我是否成功地让它正确地倒计时,因为我从一个倒计时的计时器复制了代码,并试图反转它。任何帮助都将不胜感激。 这是我的密码: int Ten_Sec = 10000; int One_Min = 60000; int Ten_Min = 600000; System.Timers.Timer t ; int hour, min, sec; private voi
int Ten_Sec = 10000;
int One_Min = 60000;
int Ten_Min = 600000;
System.Timers.Timer t ;
int hour, min, sec;
private void Form1_Load(object sender, EventArgs e)
{
t = new System.Timers.Timer();
t.Interval = 1000; //1sec
t.Elapsed -= OnTimeEvent;
}
private void Button_Ten_Sec_Click_1(object sender, EventArgs e)
{
Ten_Sec++;
}
private void Button_One_Min_Click_1(object sender, EventArgs e)
{
One_Min++;
}
private void Button_Ten_Min_Click_1(object sender, EventArgs e)
{
Ten_Min++;
}
private void OnTimeEvent(object sender, ElapsedEventArgs e)
{
Invoke (new Action(() =>
{
sec -= 1;
if (sec == 60)
{
sec = 0;
min -= 1;
}
if (min == 60)
{
min = 0;
hour -= 1;
}
textBox_Timer.Text = String.Format("{0},{1},{2}", hour.ToString().PadLeft(2, '0'), min.ToString().PadLeft(2, '0'), sec.ToString().PadLeft(2, '0'));
}));
}
我会看一看这个模型和结构。您可以操纵它们来输出您想要的任何时间量,以及从中添加和减去时间。根据您的示例,您可能希望使用
TimeSpan
TimeSpan testTime = DateTime.Now.TimeOfDay;
public Form1()
{
InitializeComponent();
timer1.Enabled = true;
timer1.Interval = 1000;
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
testTime = testTime.Subtract(new TimeSpan(0, 0, 1));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button1_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(1, 0, 0));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button2_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(0, 1, 0));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
private void button3_Click(object sender, EventArgs e)
{
testTime = testTime.Add(new TimeSpan(0, 0, 1));
lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
}
其结果如下:有一些基本的事情需要了解:
Tick
事件(或appead
事件,具体取决于您使用的计时器)。它定期提出这一事件。您可以订阅此事件的一个或多个方法,这些方法将定期触发间隔
-这是它在引发勾选
事件之前等待的毫秒数
属性。如果设置为false,则计时器未运行Start
方法。调用此方法以启动计时器。它还有一个Stop
方法,您可以在需要停止时调用该方法。这些方法还设置了Enabled
属性,因此如果调用Stop
,则Enabled
将设置为false
TimeSpan
类已经有了一种简单的方法来指定分钟数或秒数:
// We don't need these
int Ten_Sec = 10000;
int One_Min = 60000;
int Ten_Min = 600000;
另外,您正在使用System.Timers.Timer
,这在尝试更新控件文本时可能会导致一些问题,因为它在另一个线程中运行。相反,让我们使用System.Windows.Forms.Timer
:
public partial class Form1 : Form
{
System.Windows.Forms.Timer timer;
我们也可以使用变量来保存显示的时间。如果我们将其设置为类级变量,那么我们可以从计时器的勾选事件以及用户单击的按钮中更改它:
public partial class Form1 : Form
{
System.Windows.Forms.Timer timer;
TimeSpan countdownClock = TimeSpan.Zero;
现在,在您的表单\u Load
中,除了从计时器取消订阅OnTimeEvent
之外,您正在做正确的事情。如果有的话,我们应该订阅该事件,这样我们就可以在计时器过期时执行一些代码
另外请注意,我将计时器从t
重命名为timer
。它增加了可读性,并不会真正降低编码速度,因为只要键入t
,VisualStudio就会提供intellisense。我使用了TimeSpan.FromSeconds
方法来设置计时器间隔,这使得时间间隔更加明显:
private void Form1_Load(object sender, EventArgs e)
{
timer = new System.Windows.Forms.Timer();
timer.Interval = (int) TimeSpan.FromSeconds(1).TotalMilliseconds;
timer.Tick += OnTimeEvent;
DisplayTime();
}
您可能想知道那里有什么DisplayTime()
。我编写了一个小函数来显示表单上的时间,因为我们从多个位置执行它,并且它有一个特定的格式字符串。现在,这是在一个地方完成的,如果您想要更改格式,那么只有一个地方可以更改代码
另外,我注意到您使用的是文本框
来显示时间,但对于只读值,可能最好使用标签
。我创建了一个名为lblTime
:
private void DisplayTime()
{
lblTime.Text = countdownClock.ToString(@"hh\:mm\:ss");
}
现在,回答您的一个主要问题:当计时器达到0
时,我们如何停止计时器?我们可以在OnTimeEvent
事件中执行此操作,因为这是计时器读取当前倒计时时钟并从中删除一秒的时刻
请注意,此方法的签名与您的稍有不同。因为我使用的是不同类型的计时器,所以要求不同:
private void OnTimeEvent(object sender, EventArgs e)
{
// Subtract whatever our interval is from the countdownClock
countdownClock = countdownClock.Subtract(TimeSpan.FromMilliseconds(timer.Interval));
if (countdownClock.TotalMilliseconds <= 0)
{
// Countdown clock has run out, so set it to zero
// (in case it's negative), and stop our timer
countdownClock = TimeSpan.Zero;
timer.Stop();
}
// Display the current time
DisplayTime();
}
现在,在每个按钮中,我们将调用该函数,根据按下的按钮,传递不同的时间跨度:
private void Button_Ten_Sec_Click(object sender, EventArgs e)
{
// Add ten seconds to our clock
AddTimeToClock(TimeSpan.FromSeconds(10));
}
private void Button_One_Min_Click(object sender, EventArgs e)
{
// Add one minute to our clock
AddTimeToClock(TimeSpan.FromMinutes(1));
}
private void Button_Ten_Min_Click(object sender, EventArgs e)
{
// Add ten minutes to our clock
AddTimeToClock(TimeSpan.FromMinutes(10));
}
希望这足够让你走了。您现在有一个倒计时计时器,当它到达0
时将停止,您可以通过按钮向其添加时间。看起来您正在取消订阅表单\u Load中的OnTimeEvent。。。这是故意的吗?老实说,这并不是我在计算计时器的代码中看到的。举个例子,看看我的答案。@ephtee我该如何防止计时器超过零(负)或让它让我在特定的时间间隔执行某个操作?我非常欣赏你的传说,这意味着我几乎可以完成我的程序有一个错误,在向时钟添加时间时,初始时间没有显示,我只是在AddTimeToClock
方法中修复了这个错误(在开始计时之前调用DisplayTime
),我想减少计时器执行之间的时间间隔(即有效地加快倒计时)我该怎么做呢?我一直在玩计时器。间隔线,但似乎无法计算出来。重新阅读答案,它包含了您需要的所有信息。除非您的意思是希望以不同的方式显示时间,例如显示毫秒数。请将间隔设置为您希望它在触发之前等待的毫秒数ode>勾选
事件。如果要使间隔小于一秒,则需要显示毫秒。可以通过在显示时间的格式字符串末尾添加一个\.ffff
来完成。可以使用1-7个f
字符,指定要显示的毫秒数。我不知道你所说的“右边的东西”是什么意思。
private void Button_Ten_Sec_Click(object sender, EventArgs e)
{
// Add ten seconds to our clock
AddTimeToClock(TimeSpan.FromSeconds(10));
}
private void Button_One_Min_Click(object sender, EventArgs e)
{
// Add one minute to our clock
AddTimeToClock(TimeSpan.FromMinutes(1));
}
private void Button_Ten_Min_Click(object sender, EventArgs e)
{
// Add ten minutes to our clock
AddTimeToClock(TimeSpan.FromMinutes(10));
}