其他人和我一样有类似的问题;但他们实际上并没有得到一个有效的答案。我可以通过创建bool并在进入if语句后将其设置为false来使其工作。我在使用该方法之前已经完成了,但是,我想知道是否有更清洁的方法。
问题: 为什么当我在带有简单按钮的计时器中使用消息框时,有人必须单击“确定”;否则你每秒都得到同样的信息?在下面的代码中;它会每隔一秒弹出一次,因为这是定时器设置要做的(勾选一秒),但它应该只显示一次定时器击中10,如下面的代码所示,但定时器仍应“滴答”因为它显示在标签中。
在我有人因为某些原因注意到人们喜欢这样做之前,有人会把我撕成碎片。我的逻辑说,因为秒= 10,它应该显示一次。当秒= 11时,它显示一个额外的盒子是没有意义的,因为它是11而不是10.我想知道是什么原因造成的?
private void randomtimer_Tick(object sender, EventArgs e)
{
if (seconds == 10)
{
MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
seconds++;
if (seconds >= 60)
{
seconds = 0;
minutes = minutes + 1;
}
if (minutes >= 60)
{
minutes = 0;
hours = hours + 1;
}
string niceTime = string.Format("{0:D2}h:{1:D2}m:{2:D2}s", hours, minutes, seconds); //format the time so it displays nicely
label2.Text = "Session Length:\n" + niceTime;
}
答案 0 :(得分:3)
简单的答案是,因为在seconds
之前你没有递增MessageBox.Show()
。在if (seconds == 10)
测试之前移动它,您的代码将起作用。
执行流程在MessageBox.Show()
停止,然后另一个Time事件触发。在计时器方面,你必须始终注意重新进入。
答案 1 :(得分:0)
我会尽量解释这个问题,因为我可以忍受这一点。
当调用计时器的处理程序时,计数器不会被阻止。每秒(计时器的间隔)您提供的功能运行。现在,当您显示MessageBox
时,计时器的处理程序的线程被阻止。因此,在用户单击确定并且函数恢复之前,不会运行增加秒的代码。
现在,如果用户没有按OK,则第二个将停留在10.在1秒后,计时器将再次调用处理程序,并且if
将运行,因为该值仍为10。
如果您想阻止这种情况,请使用以下代码:
if (seconds == 10)
{
seconds++;
MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
else
seconds++;
当然有更好的方法,但这会奏效。
答案 2 :(得分:0)
有人必须点击没关系;否则你每秒都得到同样的信息?
现在,那是你的问题。再看一下代码:
if (seconds == 10)
{
MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
seconds++;
在MessageBox.Show
被解雇之前,秒数不会增加。将其更改为:
if (seconds == 10)
{
seconds++;
MessageBox.Show(this,"Why does this message display every one second over and over until someone clicks close or okay?");
}
else seconds++;
这将解决您的问题。