C# 通过单击按钮向计时器添加时间

C# 通过单击按钮向计时器添加时间,c#,winforms,visual-studio,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 voi

我设置了计时器,但无法通过按钮分别添加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'));


        }));
    }

我会看一看这个模型和结构。您可以操纵它们来输出您想要的任何时间量,以及从中添加和减去时间。根据您的示例,您可能希望使用
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");
    }

其结果如下:

有一些基本的事情需要了解:

  • 它有一个
    Tick
    事件(或
    appead
    事件,具体取决于您使用的计时器)。它定期提出这一事件。您可以订阅此事件的一个或多个方法,这些方法将定期触发
  • 它有一个
    间隔
    -这是它在引发
    勾选
    事件之前等待的毫秒数
  • 它有一个启用的
    属性。如果设置为false,则计时器未运行
  • 它有一个
    Start
    方法。调用此方法以启动计时器。它还有一个
    Stop
    方法,您可以在需要停止时调用该方法。这些方法还设置了
    Enabled
    属性,因此如果调用
    Stop
    ,则
    Enabled
    将设置为
    false
  • 从上到下查看代码,我要做的第一件事就是去掉这些变量。他们什么也没做,而
    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;
    
    我们也可以使用变量来保存显示的时间。如果我们将其设置为类级变量,那么我们可以从计时器的
    勾选事件以及用户单击的按钮中更改它:

    public partial class Form1 : Form
    {
        System.Windows.Forms.Timer timer;
        TimeSpan countdownClock = TimeSpan.Zero;
    
    现在,在您的
    表单\u Load
    中,除了从计时器取消订阅
    OnTimeEvent
    之外,您正在做正确的事情。如果有的话,我们应该订阅该事件,这样我们就可以在计时器过期时执行一些代码

    另外请注意,我将计时器从
    t
    重命名为
    timer
    。它增加了可读性,并不会真正降低编码速度,因为只要键入
    t
    ,VisualStudio就会提供intellisense。我使用了
    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()
    。我编写了一个小函数来显示表单上的时间,因为我们从多个位置执行它,并且它有一个特定的格式字符串。现在,这是在一个地方完成的,如果您想要更改格式,那么只有一个地方可以更改代码

    另外,我注意到您使用的是
    文本框
    来显示时间,但对于只读值,可能最好使用
    标签
    。我创建了一个名为
    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();
    }
    
    现在,在每个按钮中,我们将调用该函数,根据按下的按钮,传递不同的时间跨度:

    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
    时将停止,您可以通过按钮向其添加时间。

    看起来您正在取消订阅表单\u Load中的OnTimeEvent。。。这是故意的吗?老实说,这并不是我在计算计时器的代码中看到的。举个例子,看看我的答案。@ephtee我该如何防止计时器超过零(负)或让它让我在特定的时间间隔执行某个操作?我非常欣赏你的传说,这意味着我几乎可以完成我的程序有一个错误,在向时钟添加时间时,初始时间没有显示,我只是在
    AddTimeToClock
    方法中修复了这个错误(在开始计时之前调用
    DisplayTime
    ),我想减少计时器执行之间的时间间隔(即有效地加快倒计时)我该怎么做呢?我一直在玩计时器。间隔线,但似乎无法计算出来。重新阅读答案,它包含了您需要的所有信息。除非您的意思是希望以不同的方式显示时间,例如显示毫秒数。请将
    间隔设置为您希望它在触发之前等待的毫秒数ode>勾选
    事件。如果要使间隔小于一秒,则需要显示毫秒。可以通过在显示时间的格式字符串末尾添加一个
    \.ffff
    来完成。可以使用1-7个
    f
    字符,指定要显示的毫秒数。我不知道你所说的“右边的东西”是什么意思。
    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));
    }