C# timer 使用按钮开始倒计时

heatonc 2019-05-14 08:12:34
小白刚开始学习C#,想做个倒计时的小程序,用了timer做的,发现如下bug,求大神给指点一下,谢谢!
状况:
第一次按按钮,label2,正常倒计时 8 7 6 5 4 3 2 1
无论是倒计时结束还是使用停止按钮停止后,再次按按钮出现如下
第二次按按钮,label2,倒计时变成8 6 4 2 0
第三次按按钮,label2,倒计时变成8 5 2 0
第四次按按钮,label2,倒计时变成8 4 0
变成每按钮的次数*秒数,这样倒计时
尝试了多种方法,求大神指点,谢谢!
代码如下:

public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Timer timer = new Timer();
timer.Tick += new EventHandler(Jsptimer_Tick);
Jsq = DateTime.Parse("00:00:08");
label2.Text = Jsq.Hour.ToString("00") + ":" + Jsq.Minute.ToString("00") + ":" + Jsq.Second.ToString("00");
timer.Interval = 1000;
timer.Start();
}
private void button4_Click(object sender, EventArgs e)
{
timer.Stop();
label2.Text = "停 止 计 时!";
}

DateTime Jsq = new DateTime();
Timer timer = new Timer();

void Jsptimer_Tick(object sender, EventArgs e)
{
if (Jsq!= Convert.ToDateTime("00:00:00"))
{
Jsq = Jsq.AddSeconds(-1);
label2.Text = Jsq.Hour.ToString("00") + ":" + Jsq.Minute.ToString("00") + ":" + Jsq.Second.ToString("00");
}
else
{
timer.Stop();
this.WindowState = FormWindowState.Normal;
MessageBox.Show("倒 计 时 完 成 !");
}

...全文
592 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
heatonc 2019-05-15
  • 打赏
  • 举报
回复
学习了学习了,感谢各位大佬,这下搞明白 为啥每次都这样!感谢感谢
wanghui0380 2019-05-15
  • 打赏
  • 举报
回复
不看代码你都能看出来 8 7 6 5 4 3 2 1 ==等差数列,差值1 8 6 4 2 0==等差数列,差值2 8 5 2 0===等差数列,差值3 8 4 0==等差数列,差值4 所以,自己想,你在哪里修改了差值?
  • 打赏
  • 举报
回复
别把 声明 注册 写到 按钮事件里,这是思想问题 不是能不能完成这个功能问题 。 就算 你在停止的时候 回回都写timer.Tick -= new EventHandler(Jsptimer_Tick); 功能不报错 我觉得也不是个好代码
  • 打赏
  • 举报
回复
timer.Tick += new EventHandler(Jsptimer_Tick); 你写错位置了, 按一次按钮 注册一次,你又没有取消。 Timer timer = new Timer(); 拿到最外面声明 timer.Tick += new EventHandler(Jsptimer_Tick); 放到初始化里
E次奥 2019-05-15
  • 打赏
  • 举报
回复
Timer timer = new Timer();
在事件外定义
timer.Tick += new EventHandler(Jsptimer_Tick);

label2.Text = Jsq.Hour.ToString("00") + ":" + Jsq.Minute.ToString("00") + ":" + Jsq.Second.ToString("00");
timer.Interval = 1000;

这些代码在Loaded事件中写

Jsq = DateTime.Parse("00:00:08");
timer.Start();
在Button_Click中写
exception92 2019-05-15
  • 打赏
  • 举报
回复
每触发一次button1_Click事件,就会创建新的timer,正确的倒计时,应该在timer启动之后,按钮不可用,直到计时结束,然后将按钮可用。 “-=“操作符用于移除委托执行,也就是将事件从当前context的委托链中移除,不进行它的执行。”+=“含义相反,如果查看窗体的designer.cs文件,会发现有很多的+=事件,这些事件由编译器自动生成,比如你的button1_Click事件。
heatonc 2019-05-15
  • 打赏
  • 举报
回复
引用 4 楼 jx315425246 的回复:
不行,这样写一定会出错
我发现使用初始化方法和我之前使用的初始化 一样,会导致 窗口无限弹Messagebox 并且 每一次按按钮 这个递减速度 虽然不是乘以倍数扣减,但是 速度扣减很快,我去网上查了一下 说 Timer 是多线程操作,这点我不明白啥意思,但是用了人家的方法
timer.Tick -= Jsptimer_Tick;
按钮最前面加这个,就能正确只想,大神请指教下 这个区别到底在哪里?
heatonc 2019-05-14
  • 打赏
  • 举报
回复
引用 1 楼 jx315425246 的回复:

private void button1_Click(object sender, EventArgs e)
        {
            Timer timer = new Timer();
            timer.Tick += new EventHandler(Jsptimer_Tick);  //要释放
            Jsq = DateTime.Parse("00:00:08");
            label2.Text = Jsq.Hour.ToString("00") + ":" + Jsq.Minute.ToString("00") + ":" + Jsq.Second.ToString("00");
            timer.Interval = 1000;
            timer.Start();
        }
这样可以吗
timer.Tick -= Jsptimer_Tick; //清空事件
heatonc 2019-05-14
  • 打赏
  • 举报
回复
是不是应该在按钮执行前可以加
timer.Tick -= Jsptimer_Tick; //清空事件
来处理呢?
jx315425246 2019-05-14
  • 打赏
  • 举报
回复

private void button1_Click(object sender, EventArgs e)
{
Timer timer = new Timer();
timer.Tick += new EventHandler(Jsptimer_Tick); //要释放
Jsq = DateTime.Parse("00:00:08");
label2.Text = Jsq.Hour.ToString("00") + ":" + Jsq.Minute.ToString("00") + ":" + Jsq.Second.ToString("00");
timer.Interval = 1000;
timer.Start();
}

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧