【发布时间】:2015-03-31 14:20:07
【问题描述】:
我正在尝试制作非常简单的计时器应用程序。我确实有一个“文本”对象,它使用以下方法显示其转换为字符串后的时间:.ToString("hh\:mm\:ss");
不幸的是,在单击按钮让整个事件重新开始之后 - if 语句正在执行,就好像计时器只是在重复自身(在后台保留旧的刻度和文本值),所以 if 语句的操作开始相互重叠: (。
我在应用程序中放置了名为 timer2 的 windows.forms.timer。我还有一个名为 Button01 的按钮和一个名为 Button01text1 和 Button01textleft 的文本对象。背景颜色和计时器停止事件基于文本值比较。
OLD CODE(字符串使用无效):
private void Button01_click(object sender, EventArgs e)
{
var startTime = DateTime.Now;
Button01.BackColor = Color.FromName("Green");
Button01textleft.BackColor = Color.FromName("Green");
timer2.Tick += (obj, args) =>
{
Button01text1.Text =
(TimeSpan.FromMinutes(1) - (DateTime.Now - startTime))
.ToString("hh\\:mm\\:ss");
Button01textleft.Text =
(TimeSpan.FromMinutes(1) - (DateTime.Now - startTime))
.ToString("hh\\:mm\\:ss");
if (Button01text1.Text == "00:00:30")
{
Button01.BackColor = Color.FromName("Orange");
Button01textleft.BackColor = Color.FromName("Orange");
}
else if (Button01text1.Text == "00:00:00")
{
Button01.BackColor = Color.FromName("Red");
Button01textleft.BackColor = Color.FromName("Red");
timer2.Stop();
}
};
timer2.Enabled = true;
}
新代码(同样的问题,但感谢@Dleh 更新):
public void Button01_Click(object sender, EventArgs e)
{
Timer timer1 = new System.Windows.Forms.Timer();
var startTime = DateTime.Now;
Button01text1.BackColor = Color.FromName("Green");
Button01textleft.BackColor = Color.FromName("Green");
timer1.Tick += (obj, args) =>
{
var now = DateTime.Now;
var timeDifference = (TimeSpan.FromSeconds(30) - (now - startTime));
var stringValue = timeDifference.ToString("hh\\:mm\\:ss");
Button01text1 = stringValue;
Button01textleft.Text = stringValue;
if (timeDifference <= TimeSpan.FromSeconds(15))
{
Button01text1.BackColor = Color.FromName("Orange");
Button01textleft.BackColor = Color.FromName("Orange");
}
else if (timeDifference <=TimeSpan.FromSeconds(0))
{
Button01text1.BackColor = Color.FromName("Red");
Button01textleft.BackColor = Color.FromName("Red");
timer1.Stop();
}
};
timer1.Enabled = true;
}
现在举个例子:
我按下按钮一次 - 它变成绿色,在 30 秒时变成橙色,在 00 处变成红色并停止计时器。
如果我在计数过程中再次按下按钮(在 40 秒时),它将变为绿色并返回到 60 秒,但在剩余 50 秒时会变为橙色(好像上一个滴答声仍然倒计时并达到 30如果我没有再次点击按钮)。
我一无所知,不知道为什么会发生 - 因为它应该检查字符串文本值 - 它不应该作为单独的实例存在......
有什么想法吗?_?
正在发生的事情的示例视频: Screen_recording
玛丽亚
【问题讨论】:
-
只是一个善意的想法:请不要以字符串格式比较 DateTime 格式的数据。这可能会在以后困扰您。为程序中需要的数据使用适当的数据类型。
-
对,这听起来是个好主意——我会尽快看看如何以原始格式比较它们,不过——我没有任何其他地方可以“存储”它们——这就是为什么我使用了字符串文本值 - 因为它们已经显示在屏幕上。
-
@MariaNowinska,当多次单击按钮时,您订阅了许多处理程序的 Tick 事件,这些处理程序具有不同的 startTime。那些处理程序不同步并创建 stange 效果。
-
如何重新启动它并将计时器恢复为 0,或删除处理程序/销毁滴答事件?