点击按钮为计时器增加时间

时间:2017-05-11 17:39:59

标签: c# winforms visual-studio

我设置了一个计时器,但是通过使用按钮分别添加10秒,1分钟和10分钟无法解决如何增加时间的问题。我不确定我是否设法让它正确倒计时,因为我从计时器中复制代码并尝试将其反转。任何帮助将非常感激。 这是我的代码:

    int Ten_Sec = 10000;
    int One_Min = 60000;
    int Ten_Min = 600000;
    System.Timers.Timer t ;
    int hour, min, sec;

    private void Form1_Load(object sender, EventArgs e)
    {
        t = new System.Timers.Timer();
        t.Interval = 1000; //1sec
        t.Elapsed -= OnTimeEvent;
    }

    private void Button_Ten_Sec_Click_1(object sender, EventArgs e)
    {
        Ten_Sec++;
    }

    private void Button_One_Min_Click_1(object sender, EventArgs e)
    {
        One_Min++;
    }

    private void Button_Ten_Min_Click_1(object sender, EventArgs e)
    {
        Ten_Min++;
    }

    private void OnTimeEvent(object sender, ElapsedEventArgs e)
    {
        Invoke (new Action(() =>
        {
            sec -= 1;

            if (sec == 60)
            {
                sec = 0;
                min -= 1;
            }

            if (min == 60)
            {
                min = 0;
                hour -= 1;
            }

            textBox_Timer.Text = String.Format("{0},{1},{2}", hour.ToString().PadLeft(2, '0'), min.ToString().PadLeft(2, '0'), sec.ToString().PadLeft(2, '0'));


        }));
    }

2 个答案:

答案 0 :(得分:2)

有一些关于计时器的基本知识:

  1. 它有一个Tick事件(或Elapsed事件,具体取决于您使用的计时器)。它定期举办这次活动。您可以为此事件订阅一个或多个方法,并定期触发它们
  2. 它有一个Interval - 这是它在提升Tick事件之前等待的毫秒数。
  3. 它具有Enabled属性。如果将其设置为false,则计时器不会运行。
  4. 它有Start方法。调用此方法以启动计时器。它还有一个Stop方法,您可以在希望它停止时调用该方法。这些方法还设置了Enabled属性,因此,如果您致电Stop,则Enabled将设置为false
  5. 从上到下看你的代码,我要做的第一件事是摆脱这些变量。他们没有做任何事情,TimeSpan类已经有一种简单的方法来指定分钟数或秒数:

    // We don't need these
    int Ten_Sec = 10000;
    int One_Min = 60000;
    int Ten_Min = 600000;
    

    此外,您正在使用System.Timers.Timer,这可能会在尝试更新控件文本时造成一些麻烦,因为它在另一个线程中运行。相反,让我们使用System.Windows.Forms.Timer

    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer timer;
    

    我们还可以使用变量来保存我们显示的时间。如果我们将其设为类级变量,那么我们可以从计时器的Tick事件以及用户点击的按钮更改它:

    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer timer;
        TimeSpan countdownClock = TimeSpan.Zero;
    

    现在,在您的Form_Load中,您正在做正确的事情,除非您从计时器取消订阅OnTimeEvent。如果有的话,我们应该订阅事件,所以我们有一些代码在计时器过去时执行。

    另请注意,我将您的计时器从t重命名为timer。它提高了可读性,并没有真正减慢编码速度,因为只要您键入t,Visual Studio就会提供智能感知功能。我使用TimeSpan.FromSeconds方法设置定时器间隔,这使间隔更明显:

    private void Form1_Load(object sender, EventArgs e)
    {
        timer = new System.Windows.Forms.Timer();
        timer.Interval = (int) TimeSpan.FromSeconds(1).TotalMilliseconds;
        timer.Tick += OnTimeEvent;
        DisplayTime();
    }
    

    您可能想知道DisplayTime()的用途。我写了一个小函数来显示表单上的时间,因为我们从多个地方做了它并且它有一个特定的格式字符串。既然这是在一个地方完成的,如果你想改变格式,那么只有一个地方可以改变代码。

    此外,我注意到您使用TextBox来显示时间,但对于只读值,使用Label可能更好。我创建了一个名为lblTime

    的文件
    private void DisplayTime()
    {
        lblTime.Text = countdownClock.ToString(@"hh\:mm\:ss");
    }
    

    现在,回答您的一个主要问题:如何在计时器到达0时停止计时器?我们可以在OnTimeEvent事件中执行此操作,因为这是计时器正在读取当前倒计时时钟并从中删除秒的时刻。

    请注意,此方法的签名与您的签名略有不同。由于我使用的是不同类型的计时器,因此要求不同:

    private void OnTimeEvent(object sender, EventArgs e)
    {
        // Subtract whatever our interval is from the countdownClock
        countdownClock = countdownClock.Subtract(TimeSpan.FromMilliseconds(timer.Interval));
    
        if (countdownClock.TotalMilliseconds <= 0)
        {
            // Countdown clock has run out, so set it to zero 
            // (in case it's negative), and stop our timer
            countdownClock = TimeSpan.Zero;
            timer.Stop();
        }
    
        // Display the current time
        DisplayTime();
    }
    

    所以剩下要做的就是启用计时器。由于我们从0开始,因此无法向下计算,但您的表单上似乎有一些按钮可以为时钟添加时间,所以让我们使用它们。 / p>

    因为我们要从多个地方更新时间,这也需要检查计时器是否已禁用,如果不是,则启动它,我创建了一个辅助方法来增加时间到时钟:

    private void AddTimeToClock(TimeSpan timeToAdd)
    {
        // Add time to our clock
        countdownClock += timeToAdd;
    
        // Display the new time
        DisplayTime();
    
        // Start the timer if it's stopped
        if (!timer.Enabled) timer.Start();
    }
    

    现在,在每个按钮中,我们只需调用该功能,根据按下的按钮传递不同的时间段:

    private void Button_Ten_Sec_Click(object sender, EventArgs e)
    {
        // Add ten seconds to our clock
        AddTimeToClock(TimeSpan.FromSeconds(10));
    }
    
    private void Button_One_Min_Click(object sender, EventArgs e)
    {
        // Add one minute to our clock
        AddTimeToClock(TimeSpan.FromMinutes(1));
    }
    
    private void Button_Ten_Min_Click(object sender, EventArgs e)
    {
        // Add ten minutes to our clock
        AddTimeToClock(TimeSpan.FromMinutes(10));
    }
    

    希望这足以让你前进。您现在有一个倒数计时器,当它到达0时会停止,您可以从按钮中添加时间。

答案 1 :(得分:1)

我会看一下DateTimeTimeSpan结构。您可以操纵它们以输出您想要的任何时间量以及从中添加和减去时间。根据您的示例,您可能希望使用TimeSpan

    TimeSpan testTime = DateTime.Now.TimeOfDay;
    public Form1()
    {
        InitializeComponent();
        timer1.Enabled = true;
        timer1.Interval = 1000;
        timer1.Start();

    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        testTime = testTime.Subtract(new TimeSpan(0, 0, 1));
        lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
    }

    private void button1_Click(object sender, EventArgs e)
    {
        testTime = testTime.Add(new TimeSpan(1, 0, 0));
        lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
    }

    private void button2_Click(object sender, EventArgs e)
    {
        testTime = testTime.Add(new TimeSpan(0, 1, 0));
        lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
    }

    private void button3_Click(object sender, EventArgs e)
    {
        testTime = testTime.Add(new TimeSpan(0, 0, 1));
        lblTime.Text = testTime.ToString("hh\\:mm\\:ss");
    }

会产生以下结果:enter image description here