我没有等,但我猜分钟也有同样的问题。 当计时器递减计数且秒数变为1时,它将变为59,而不是先播0。我不确定计时器的逻辑,是否在递增/递减计数时应显示0。
当计数时,它工作正常,在59之后显示0。
private void timer1_Tick(object sender, EventArgs e)
{
if (countUpCheckbox.Checked)
{
Invoke(new Action(() =>
{
seconds += 1;
if (seconds == 60)
{
seconds = 0;
minutes += 1;
}
if (minutes == 60)
{
minutes = 0;
hours += 1;
}
richTextBox1.Text = string.Format("{0}:{1}:{2}", hours.ToString().PadLeft(2, '0'), minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'));
}));
}
if (countdownCheckbox.Checked)
{
Invoke(new Action(() =>
{
seconds -= 1;
if (seconds == 0)
{
seconds = 59;
minutes -= 1;
}
if (minutes == 0)
{
minutes = 59;
hours -= 1;
}
richTextBox1.Text = string.Format("{0}:{1}:{2}", hours.ToString().PadLeft(2, '0'), minutes.ToString().PadLeft(2, '0'), seconds.ToString().PadLeft(2, '0'));
}));
}
}
答案 0 :(得分:5)
尝试使用TimeSpan,并让它计算分钟/秒:
private void timer1_Tick(object sender, EventArgs e)
{
Invoke(new Action(() =>
{
if (countUpCheckbox.Checked)
{
timespan += TimeSpan.FromSeconds(1);
}
if (countdownCheckbox.Checked)
{
timespan -= TimeSpan.FromSeconds(1);
}
richTextBox1.Text = string.Format("{0}:{1}:{2}", timespan.Hours.ToString().PadLeft(2, '0'), timespan.Minutes.ToString().PadLeft(2, '0'), timespan.Seconds.ToString().PadLeft(2, '0'));
}));
}
在您的班级中初始化它,如下所示:
private TimeSpan timespan = new TimeSpan(0);
答案 1 :(得分:3)
在您的函数中,您需要给它一个显示0的机会,并检查回到下方 0的秒数,然后再回到59,因此...
...
if (countdownCheckbox.Checked)
{
Invoke(new Action(() =>
{
seconds -= 1;
if (seconds == -1) // <<<< check for -1 instead of 0
{
seconds = 59;
minutes -= 1;
}
if (minutes == -1) // <<<< And as you say, same for mins
{
minutes = 59;
hours -= 1;
}
...
请注意,要使其正常工作,必须将seconds
和minutes
声明为signed
个数值,而不是unsigned
。