C#计时器(TimeSpan)始终在后台打勾(如果在不为真时应用语句) - c#

我正在尝试制作非常简单的计时器应用程序。我确实有一个“文本”对象,该对象使用.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"…