C#计时器不会打勾

时间:2010-03-19 06:38:39

标签: c# winforms timer

我有一个奇怪的问题...... 在过去的几个小时里,我一直在想不起...... 我输入winform代码的计时器(来自工具栏)不会勾选...

我的程序中有几种形式的计时器,它们都工作正常......我试着完全一样,它不会打勾...... 我选择它,将它拖到一个表单上,启用它,设置间隔并处理tick事件......没有任何反应...... 我甚至尝试在tick事件中添加像mailboxbox.show这样的随机代码,只是为了看看是否有任何事情发生,什么都没有! 正如我所说,我的程序中有一些计时器(在其他表格上,而不是我试图放置这个计时器的那个)并且它们都工作正常......

有什么建议吗?

提前感谢!

6 个答案:

答案 0 :(得分:10)

我发现如果我从非UI线程中停止计时器,然后再次启动它,我就会丢失事件钩子。

我不知道“正确”答案是什么,但这对我来说效果很好:

public class BetterTimer : System.Windows.Forms.Timer
{
    public BetterTimer():base()        
    { base.Enabled = true; }

    public BetterTimer(System.ComponentModel.IContainer container) : base(container) 
    { base.Enabled = true; }

    private bool _Enabled;
    public override bool Enabled
    {
        get { return _Enabled; }
        set { _Enabled = value; }
    }

    protected override void OnTick(System.EventArgs e)
    { if (this.Enabled) base.OnTick(e); }
}

这种方法有三点:

1)通过覆盖构造函数,我确保从头开始启用基本计时器。

2)通过覆盖“启用”,我从不让基本计时器被禁用,但界面不会改变。

3)通过覆盖“OnTick”,我让被覆盖的Enabled属性决定是否应该触发事件。

Start()和Stop()分别通过将true和false设置为Enabled属性来工作。

顺便说一句 - 有没有人知道为什么当从非UI线程停止/禁用定时器时,事件永远不会触发(或断开连接?)?

答案 1 :(得分:7)

不要System.Windows.Forms.Timer计时器启动.enabled ...无论如何..我刚刚开始工作......我将视觉工作室生成的代码形式WINFORMNAME.designer.cs复制到WINFORMNAME的.cs ... 我不知道如何以及为什么但它有效...

System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer();
timer.Enabled = true;
timer.Interval = 1000; 
timer.Tick += new EventHandler(timer_Tick); 
        void timer_Tick(object sender, EventArgs e)
        {
//do something
        }

感谢大家的答案!

答案 2 :(得分:6)

请务必致电timer1.Start()

启动它

答案 3 :(得分:2)

要回答上一个问题,不允许操纵在另一个线程上创建的控件。您可以通过代表调用。

答案 4 :(得分:1)

我之前遇到过这种情况。我在设置间隔之前启用了计时器。交换两条线使其工作。

答案 5 :(得分:0)

我和Andrej有同样的问题,我尝试过在网上找到的几种解决方案。

我的程序中每个表单都有时间限制(倒计时),以下是我如何解决它:

我使用过计算机工程解决方案。把它关掉再打开!! :))我的意思是我不知道为什么,但它的工作原理!!

首先,我从.cs和设计中删除了所有计时器 然后我在每个表单中添加了一个计时器,并为计时器和文本框添加了不同的名称,并逐个编写相同的代码。

我刚使用了timer.start()和Timer.stop()

private void Form7_Load_1(object sender, EventArgs e)
    {
        timer7.Start();
    }

    int duration = 30;

    private void timer7_Tick(object sender, EventArgs e)
    {
        duration--;
        textBox7.Text = duration.ToString(); // to show the countdown 

        if (duration == 0)
        {
            timer7.Stop();
            MessageBox.Show("You ran out of time. Please go to the next page");

            this.Hide();
            Form8 f8 = new Form8();
            f8.ShowDialog();
        }
    }

希望有所帮助