我正在尝试制作非常简单的计时器应用程序。我确实有一个“文本”对象,该对象使用.ToString(“ hh \:mm \:ss”);转换为字符串后显示时间。
不幸的是,在单击整个事件的按钮后再次开始-如果执行if语句,就好像计时器只是在重复自己一样(将旧的tick和text值保留在后台),因此if语句的动作开始彼此重叠:(。
我在应用程序中放置了名为timer2的windows.forms.timer。我还有一个名为Button01的按钮和一个名为Button01text1&Button01textleft的文本对象。背景颜色和计时器停止事件基于文本值比较。
旧代码(无效的字符串用法):
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
玛利亚
参考方案
这应该工作:
private DateTime startTime;
private void timerTick(Object obj, EventArgs 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();
}
}
public void Button01_Click(object sender, EventArgs e)
{
startTime = DateTime.Now;
Button01.BackColor = Color.FromName("Green");
Button01textleft.BackColor = Color.FromName("Green");
timer2.Tick -= timerTick;
timer2.Tick += timerTick;
timer2.Enabled = true;
}
这是承诺的多个计时器的更通用解决方案:
// State of specific counter
private class Counter
{
public Timer timer;
public DateTime startTime;
public Button button;
public Label text;
public Label textLeft;
}
// List of counters
private List<Counter> counters;
private void Form1_Load(object sender, EventArgs e)
{
// Initialize counters
counters = new List<Counter>();
counters.Add(new Counter { timer = timer1, button = Button01, text = Button01text, textLeft = Button01textleft });
counters.Add(new Counter { timer = timer2, button = Button02, text = Button02text, textLeft = Button02textleft });
counters.Add(new Counter { timer = timer3, button = Button03, text = Button03text, textLeft = Button03textleft });
counters.Add(new Counter { timer = timer4, button = Button04, text = Button04text, textLeft = Button04textleft });
counters.Add(new Counter { timer = timer5, button = Button05, text = Button05text, textLeft = Button05textleft });
// Add more if you need
// Attach handlers
foreach (var counter in counters)
{
counter.timer.Tick += timerTick;
counter.button.Click += buttonClick;
}
}
private void timerTick(Object sender, EventArgs args)
{
// Prepare context
var timer = (Timer) sender;
var counter = counters.Find(c => c.timer == timer);
var startTime = counter.startTime;
var button = counter.button;
var text = counter.text;
var textLeft = counter.textLeft;
// Update time
var time = TimeSpan.FromMinutes(1) - (DateTime.Now - startTime);
text.Text = time.ToString("hh\\:mm\\:ss");
textLeft.Text = time.ToString("hh\\:mm\\:ss");
if (time.TotalSeconds < 1)
{
button.BackColor = Color.FromName("Red");
textLeft.BackColor = Color.FromName("Red");
timer.Stop();
}
else if (time.TotalSeconds < 31)
{
button.BackColor = Color.FromName("Orange");
textLeft.BackColor = Color.FromName("Orange");
}
}
public void buttonClick(object sender, EventArgs e)
{
// Prepare context
var button = (Button)sender;
var counter = counters.Find(c => c.button == button);
var timer = counter.timer;
var textLeft = counter.textLeft;
// Start counter
counter.startTime = DateTime.Now;
button.BackColor = Color.FromName("Green");
textLeft.BackColor = Color.FromName("Green");
timer.Enabled = true;
}
如何从php中获取datatables jQuery插件的json数据 - php我是PHP的新手,正在尝试使用Datatables jQuery插件。我知道我必须从.php文件中获取数据,然后在数据表中使用它,但是我似乎无法通过ajax将其传递给数据表。我设法从数据库中获取数据,并对其进行json编码,但是后来我不知道如何在我的index.php文件中调用它,并在其中显示它。我究竟做错了什么?这是我的代码:HTML(已编辑): <…
当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…
改造正在返回一个空的响应主体 - java我正在尝试使用Retrofit和Gson解析一些JSON。但是,我得到的响应机构是空的。当我尝试从对象中打印信息时,出现NullPointerException。我确保URL正确,并且我也确保POJO也正确。我正在使用jsonschema2pojo来帮助创建POJO类。这是我要解析的JSON{ "?xml": { "@versi…
jQuery发布不会将数据发布到ASP.NET API控制器 - javascript我有一次噩梦般的时间通过jquery post将数据发送到ASP.NET Controller。这是JSON.stringify之后的数据:[{"scheduleTaskID":"203","task":"Permit","baselineDate":…
每个文件合并后添加换行 - python我有很多类似以下内容的JSON文件:例如。1.json{"name": "one", "description": "testDescription...", "comment": ""} test.json{"name"…