为什么当计时器递减计数时,它从未在秒上显示0?

时间:2018-09-28 23:06:53

标签: c# winforms

我没有等,但我猜分钟也有同样的问题。 当计时器递减计数且秒数变为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'));
                }));
            }
        }

2 个答案:

答案 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;
                }
                ...

请注意,要使其正常工作,必须将secondsminutes声明为signed个数值,而不是unsigned