如何在计时器上更新我的WinForm标签?

时间:2013-12-28 15:11:32

标签: winforms label

我无法更新我的WinForm标签属性。

详细信息:我正在尝试检查我的数据库并发布了一些值,但我甚至无法更新标签。我正在使用SharpDevelop。

代码:

//this is my form

public partial class MainForm : Form
{   

//Declaring timer
public static System.Timers.Timer aTimer = new System.Timers.Timer();

public MainForm()
{
    InitializeComponent();

    //Timer
    aTimer.Elapsed +=new ElapsedEventHandler(OnTimedEvent);
    aTimer.Interval = 2000; //milisecunde
    aTimer.Enabled = true;  

    label1.Text="some_text";        
}

private static void OnTimedEvent(object source, ElapsedEventArgs e) {Check();}

public static void Check()
{
    //Database checks here..

    try{label1.Text="new_text";}catch(Exception e)  {MessageBox.Show(e.ToString());}
    MessageBox.Show("BAAAA");
}

    void Button1Click(object sender, EventArgs e)
    {
        label1.Text = "mergeeeeee?!";
    }

}

编辑:我删除了所有静态修饰符。还使用新代码更新了帖子(尝试使用catch并在其后添加消息框+更改标签的按钮)。 该尝试捕获以下错误:

enter image description here

。真的可以使用一些帮助,研究答案超过6个小时。

2 个答案:

答案 0 :(得分:3)

尝试此操作(使用System.Windows.Forms.Timer代替System.Timers.Timer):

//Declaring timer
public System.Windows.Forms.Timer aTimer = new System.Windows.Forms.Timer();

public Form1()
{
    InitializeComponent();

    //Timer
    aTimer.Tick += aTimer_Tick;
    aTimer.Interval = 2000; //milisecunde
    aTimer.Enabled = true;

    label1.Text = "some_text";    
}

void aTimer_Tick(object sender, EventArgs e)
{
    Check();
}

public void Check()
{            
    try 
    {
        //Database checks here..
        label1.Text = string.Format("new_text {0}", DateTime.Now.ToLongTimeString()); 
    }
    catch (Exception ex)
    {
        throw ex;
    }
    MessageBox.Show("BAAAA");
}

System.Timers.Timer的{​​{3}}事件在非UI线程上触发(将原始代码更改为不吞下异常,您应该看到跨线程异常)。

答案 1 :(得分:0)

我为我的项目使用了以下代码,但它确实有效。 它有一个按钮来激活定时器,定时器在500毫秒过后会引发一个事件。

private void ActiveTimer_Click(object sender, EventArgs e)
{
    EnableTimer();
}

private void EnableTimer()
{
    System.Timers.Timer raiseTimer = new System.Timers.Timer();
    raiseTimer.Interval = 500;
    raiseTimer.Elapsed += RaiseTimerEvent;
    raiseTimer.AutoReset = true;
    raiseTimer.Enabled = true;
}

private void RaiseTimerEvent(object sender, System.Timers.ElapsedEventArgs e)
{
    this.Invoke(new Action(() => 
        {
            label1.Text += "500 ms passed\n";
        }));
}