倒计时进入负数(00:00:00)
本文关键字:倒计时 | 更新日期: 2023-09-27 17:54:32
我制作了一个简单的倒计时计时器,但是当我在文本框上输入0 : 0 : 0
时,计时器进入负-1 : 59 : 59
。我尝试输入0 : 0 : 1
,定时器停在0 : 0 : 0
,屏幕上出现消息框
我已经尝试了这个代码来防止负值,但它停止在-1 : 59 : 58
if (label1.Text == "-1")
{
timer1.Stop()
}
尝试此代码,但在-1 : 59 : 59
处停止
if (h < 0)
{
timer1.Stop();
}
这里是代码
namespace Timer
{
public partial class Form1 : Form
{
int h;
int m;
int s;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
if (textBox1.Text == "")
{
textBox1.Text = "0";
}
if (textBox2.Text == "")
{
textBox2.Text = "0";
}
if (textBox3.Text == "")
{
textBox3.Text = "0";
}
h = Convert.ToInt32(textBox1.Text);
m = Convert.ToInt32(textBox2.Text);
s = Convert.ToInt32(textBox3.Text);
timer1.Start();
}
private void timer1_Tick(object sender, EventArgs e)
{
s = s - 1;
if(s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
if (h == 0 && m == 0 && s == 0)
{
timer1.Stop();
MessageBox.Show("Times up!", "Time");
}
string hh = Convert.ToString(h);
string mm = Convert.ToString(m);
string ss = Convert.ToString(s);
label1.Text = hh;
label2.Text = mm;
label3.Text = ss;
}
private void button2_Click(object sender, EventArgs e)
{
timer1.Stop();
}
}
}
您的代码正在做您告诉它要做的事情,问题是您没有处理边缘情况从0:0:0
开始。
我认为这将被认为是一个无效的输入,所以处理这个问题的最简单的方法可能是在你启动按钮中的计时器之前检查一下:
h = Convert.ToInt32(textBox1.Text);
m = Convert.ToInt32(textBox2.Text);
s = Convert.ToInt32(textBox3.Text);
// one of these must be non-zero
if (h != 0 || m != 0 || s != 0)
{
timer1.Start();
}
else
{
// handle this how ever you want but you don't need to start a timer
// and really shouldn't start the timer
}
如果用户输入的都是0,那么让计时器滴答实际上是一个错误,因为当他们要求0秒时,他们会得到1秒。
更好的做法是在输入非零时间之前禁用按钮。要做到这一点,我建议用NumericUpDown
替换TextBox
(因为无论如何只有数字输入是有效的),然后为它们的ValueChanged
事件添加处理程序。在该处理程序中,检入三个控件中的任何一个都具有非零值,如果是非零值,则启用按钮。如果均为0,则禁用该按钮。
这里有一个重要的旁白- System.Windows.Forms.Timer
不是特别准确,所以不要期望计时器设置为每1秒滴答一次,实际上每1秒滴答一次。每个滴答之间的至少为 1秒,但通常会多几毫秒。所以你的倒计时会漂移。如果您将其设置为倒数1分钟(即60
秒),如果实际上需要62
秒来倒数,请不要感到惊讶。如果这对你来说很重要,那么你应该在启动计时器时记录当前时间,然后检查当前时间和启动计时器时的时间之间的差异,并使用它来更新你的标签。
一个更好的整体解决方案可能是这样的:
DateTime end;
private void button1_Click(object sender, EventArgs e)
{
var h = hourNumericUpDown.Value;
var m = minuteNumericUpDown.Value;
var s = secondsNumericUpDown.Value;
if (h != 0 || m != 0 || s != 0)
{
var start = DateTime.Now;
var timeSpan = new TimeSpan(0,h,m,s);
end = start.Add(timeSpan);
countDownLabel.Text = timeSpan.ToString();
timer1.Start();
}
}
private void timer1_Tick(object sender, EventArgs e)
{
var timeleft = end - DateTime.Now;
if (timeLeft.Ticks < 0)
{
countDownLabel.Text = "00:00:00";
timer1.Stop();
MessageBox.Show("Times up!", "Time");
}
else
{
countDownLabel.Text = string.Format("{0:D2}:{1:D2}:{2:D2}",
timeLeft.Hours, timeLeft.Minutes, timeLeft.Seconds);
}
}
然后你最好把计时器设置得快一点。也许每半秒,或者每四分之一秒,这样显示就不会超过这个距离。
不包括提供0:0:0的情况。替换:
s = s - 1;
if(s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
与这个:if(s > 0 || m > 0 || h > 0)
{
s = s - 1;
if(s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
}
你没有检查h何时为负,我已经添加了一个,你可以添加你的。
if (s == -1)
{
m = m - 1;
s = 59;
}
if (m == -1)
{
h = h - 1;
m = 59;
}
/*I added such condition*/
if(h < 0)
{
h = 0;
m = 0;
s = 0;
}
if (h == 0 && m == 0 && s == 0)
{
timer1.Stop();
MessageBox.Show("Times up!", "Time");
return;//return early
}