C# 重置倒计时计时器

C# 重置倒计时计时器,c#,winforms,timer,countdowntimer,C#,Winforms,Timer,Countdowntimer,没有EventHandler(timerIdle_Tick),计时器不会启动: 按照指示后的计时器代码进行操作: class Timers { public static System.Windows.Forms.Label lblIdle; public static Timer timerIdle = new Timer(); public static int segundo = 0; // TIMER IDLE public static voi

没有EventHandler(timerIdle_Tick),计时器不会启动:

按照指示后的计时器代码进行操作:

class Timers
{
    public static System.Windows.Forms.Label lblIdle;
    public static Timer timerIdle = new Timer();
    public static int segundo = 0;

    // TIMER IDLE
    public static void timerIdleOn()
    {
        segundo = 300;
        timerIdle.Interval = 1000;
        timerIdle.Start();
    }
    public static void timerIdleOff()
    {
        timerIdle.Stop();
    }

    public static void timerIdle_Tick(object sender, EventArgs e)
    {
        segundo--;

        if (segundo == 0)
        {
            timerIdle.Stop();
            dgView.addLinha(2, "config_Teste", "TIMER ACABOU", 0);
        }
        else
            dgView.addLinha(2, "config_Teste", TimeSpan.FromSeconds(segundo).ToString(@"mm\:ss"), 0);
    }
}
它跟在计时器启动的地方,我不使用按钮,只是一个临时的测试方法,之后它就不存在了

namespace HC
{
    public partial class frm_console : Form
    {
        public frm_console()
        {
            InitializeComponent();
            dgView.DataConsole = this.DataConsol;           
            Timers.timerIdleOn();
        }
    }
}
你试过这个吗:

  timerIdle.Enabled = false;
  timerIdle.Enabled = true;
你试过这个吗:

  timerIdle.Enabled = false;
  timerIdle.Enabled = true;
关于这一点:

timerIdle.Stop();
timerIdle.Start();
计时器
对象不知道任何有关计时的信息。它只是一种允许定期调用
timerIdle\u Tick()
方法的机制。因此,简单地停止并再次启动计时器自然不会对计时器显示的时间产生任何影响

与您之前关于该计划的问题一样,您仍然没有提供详细的信息。因此,不可能确切地知道需要什么

但是看看你发布的代码,在我看来,你可以简单地给
tempo
变量分配一个新值,在你想要的任何时间开始倒计时。例如:

timerIdle.Stop();
节奏=300;//300秒,换句话说,5分钟
timerIdle.Start();
无论如何,您的代码可以简化。好吧,暂时忽略“在每个滴答声上减少一秒计数器”是实现这一点的错误方法(正如在前面的问题中向您解释的那样),您的
滴答声
处理程序方法的主体可能看起来更像这样,但仍然执行相同的操作:

public static void timerIdle_Tick(对象发送方,事件参数e)
{
节奏--;//首先递减,然后segundo和minuto将自动正确递减
//注:目前尚不清楚这些是否在该方法之外使用。
//如果不是,只需将它们设置为局部变量,并仅在
//下面的“else”块。
minuto=tempo/60;//如果tempo<60,则为0
segundo=tempo%60;//如果tempo<60,则为tempo
如果(节奏<0)
{
timerIdle.Stop();
//警告:这将导致timerIdle对象对将来的使用无效。
//如果在此之后尝试重新启动计时器而不创建新计时器
//语句执行时,将引发异常
//重复使用timerIdle,您不应该在此处处理它。
timerIdle.Dispose();
dgView.addLinha(2,“配置测试”,“计时器ACABOU”,0);
}
其他的
{
//无需将minuto和segundo重新组合成节奏,
//因为节奏一开始就已经减少了,而且
//在这里继续具有正确的值。
string temp=string.Format($“{minuto:D2}:{segundo:D2}”);
lblIdle.Text=温度;
dgView.addLinha(2,“配置测试”,温度,0);
}
}
关于此:

timerIdle.Stop();
timerIdle.Start();
计时器
对象不知道任何有关计时的信息。它只是一种允许定期调用
timerIdle\u Tick()
方法的机制。因此,简单地停止并再次启动计时器自然不会对计时器显示的时间产生任何影响

与您之前关于该计划的问题一样,您仍然没有提供详细的信息。因此,不可能确切地知道需要什么

但是看看你发布的代码,在我看来,你可以简单地给
tempo
变量分配一个新值,在你想要的任何时间开始倒计时。例如:

timerIdle.Stop();
节奏=300;//300秒,换句话说,5分钟
timerIdle.Start();
无论如何,您的代码可以简化。好吧,暂时忽略“在每个滴答声上减少一秒计数器”是实现这一点的错误方法(正如在前面的问题中向您解释的那样),您的
滴答声
处理程序方法的主体可能看起来更像这样,但仍然执行相同的操作:

public static void timerIdle_Tick(对象发送方,事件参数e)
{
节奏--;//首先递减,然后segundo和minuto将自动正确递减
//注:目前尚不清楚这些是否在该方法之外使用。
//如果不是,只需将它们设置为局部变量,并仅在
//下面的“else”块。
minuto=tempo/60;//如果tempo<60,则为0
segundo=tempo%60;//如果tempo<60,则为tempo
如果(节奏<0)
{
timerIdle.Stop();
//警告:这将导致timerIdle对象对将来的使用无效。
//如果在此之后尝试重新启动计时器而不创建新计时器
//语句执行时,将引发异常
//重复使用timerIdle,您不应该在此处处理它。
timerIdle.Dispose();
dgView.addLinha(2,“配置测试”,“计时器ACABOU”,0);
}
其他的
{
//无需将minuto和segundo重新组合成节奏,
//因为节奏一开始就已经减少了,而且
//在这里继续具有正确的值。
string temp=string.Format($“{minuto:D2}:{segundo:D2}”);
lblIdle.Text=温度;
dgView.addLinha(2,“配置测试”,温度,0);
}
}

这更像是我期望看到的。计时器正在
frm_控制台
类中创建和处理。请注意,已删除所有的
静态
s:

public partial class frm_console : Form
{

    public int segundo = 300;
    public Timer timerIdle = new Timer();   
    
    public frm_console()
    {
        InitializeComponent();
        dgView.DataConsole = this.DataConsol;
        timerIdle.Interval = 1000; 
        timerIdle.Tick += new EventHandler(timerIdle_Tick);        
        timerIdle.Start();
    }
    
    private void btnReset_Click(object sender, EventArgs e)
    {
        segundo = 300; // reset to 5 minutes
        timerIdle.Start();
    }

    private void btnPauseResume_Click(object sender, EventArgs e)
    {
        if (timerIdle.Enabled)
        {
            timerIdle.Stop();
        }
        else if (segundo > 0)
        {
            timerIdle.Start();
        }
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        timerIdle.Stop();
    }   

    public void timerIdle_Tick(object sender, EventArgs e)
    {
        segundo--;
        
        if (segundo == 0)
        {
            timerIdle.Stop();
            dgView.addLinha(2, "config_Teste", "TIMER ACABOU", 0);
        }
        else
        {
            dgView.addLinha(2, "config_Teste", TimeSpan.FromSeconds(segundo).ToString(@"mm\:ss"), 0);
        }
    }
            
}

以“btn”开头的方法是按钮点击处理程序,但它们可以转换为常规方法。你应该能够理解他们在做什么。

这更像是我期望看到的。计时器正在
frm_控制台
类中创建和处理。请注意,已删除所有的
静态
s:

public partial class frm_console : Form
{

    public int segundo = 300;
    public Timer timerIdle = new Timer();   
    
    public frm_console()
    {
        InitializeComponent();
        dgView.DataConsole = this.DataConsol;
        timerIdle.Interval = 1000; 
        timerIdle.Tick += new EventHandler(timerIdle_Tick);        
        timerIdle.Start();
    }
    
    private void btnReset_Click(object sender, EventArgs e)
    {
        segundo = 300; // reset to 5 minutes
        timerIdle.Start();
    }

    private void btnPauseResume_Click(object sender, EventArgs e)
    {
        if (timerIdle.Enabled)
        {
            timerIdle.Stop();
        }
        else if (segundo > 0)
        {
            timerIdle.Start();
        }
    }

    private void btnStop_Click(object sender, EventArgs e)
    {
        timerIdle.Stop();
    }   

    public void timerIdle_Tick(object sender, EventArgs e)
    {
        segundo--;
        
        if (segundo == 0)
        {
            timerIdle.Stop();
            dgView.addLinha(2, "config_Teste", "TIMER ACABOU", 0);
        }
        else
        {
            dgView.addLinha(2, "config_Teste", TimeSpan.FromSeconds(segundo).ToString(@"mm\:ss"), 0);
        }
    }
            
}
以“btn”开头的方法是按钮点击处理程序,但它们可以转换为常规方法。你应该能够理解他们在做什么。