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

Winforms 如何在计时器上更新WinForm标签?,winforms,label,Winforms,Label,我无法更新我的WinForm标签属性 详细信息:我试图检查我的数据库并发布一些值,但我甚至不能更新一个看起来很简单的标签。我用的是夏普 守则: //this is my form public partial class MainForm : Form { //Declaring timer public static System.Timers.Timer aTimer = new System.Timers.Timer(); public MainForm() { Ini

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

详细信息:我试图检查我的数据库并发布一些值,但我甚至不能更新一个看起来很简单的标签。我用的是夏普

守则:

//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?!";
    }

}
编辑:我已删除所有静态修改器。还用新代码更新了帖子(添加了try-catch,并在其后面添加了messagebox+一个更改标签的按钮)。 try捕捉到以下错误:

。确实需要一些帮助,已经研究了6个多小时的答案。

试试这个(使用
系统.Windows.Forms.Timer
而不是
系统.Timers.Timer
):

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

试试这个(使用
System.Windows.Forms.Timer
而不是
System.Timers.Timer
):


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

我在我的项目中使用了下面的代码,它成功了。 它有一个按钮来激活计时器,当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";
        }));
}

我在我的项目中使用了下面的代码,它成功了。 它有一个按钮来激活计时器,当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";
        }));
}

首先从标签、计时器、事件处理程序和
Check()
方法中删除所有
静态
修饰符。我怀疑你真的不需要所有这些东西都是静态的。除了使用静态之外,您的代码的其余部分看起来还不错。去掉了所有的静态,它似乎可以在没有它们的情况下运行编译。。但标签没有变化。我想我的计时器坏了。。我尝试在Check函数中添加MessageBox.Show(“文本”),但它不会出现在表单中添加按钮,在它的clicked事件处理程序中,设置label1.text以验证您是否可以更改标签的文本。另外,尝试在
OnTimedEvent
处理程序中设置断点,这是查看是否正在调用它的更好方法。我添加了按钮,它会更改标签的文本。另外,label1.Text之后的所有命令(在Check函数中)似乎都为空。我把try{}catch{}放在那里,现在我可以在它之后调用MessageBox。我认为在那一点上(检查函数中的label1.text)程序中断。你的label1有问题。你的尝试/捕获正在吞噬例外;您应该在
catch
块的消息框中显示异常。我仍然不相信你已经删除了所有的
静态
修饰符。最后,我将创建一个全新的WinForm项目,拖入一个标签,拖入计时器并设置一个单击处理程序,然后写一行来更改标签的文本。静态方法和变量没有额外的业务。首先从标签、计时器、事件处理程序和
Check()
方法中删除所有
static
修饰符。我怀疑你真的不需要所有这些东西都是静态的。除了使用静态之外,您的代码的其余部分看起来还不错。去掉了所有的静态,它似乎可以在没有它们的情况下运行编译。。但标签没有变化。我想我的计时器坏了。。我尝试在Check函数中添加MessageBox.Show(“文本”),但它不会出现在表单中添加按钮,在它的clicked事件处理程序中,设置label1.text以验证您是否可以更改标签的文本。另外,尝试在
OnTimedEvent
处理程序中设置断点,这是查看是否正在调用它的更好方法。我添加了按钮,它会更改标签的文本。另外,label1.Text之后的所有命令(在Check函数中)似乎都为空。我把try{}catch{}放在那里,现在我可以在它之后调用MessageBox。我认为在那一点上(检查函数中的label1.text)程序中断。你的label1有问题。你的尝试/捕获正在吞噬例外;您应该在
catch
块的消息框中显示异常。我仍然不相信你已经删除了所有的
静态
修饰符。最后,我将创建一个全新的WinForm项目,拖入一个标签,拖入计时器并设置一个单击处理程序,然后写一行来更改标签的文本。静态方法和变量没有额外的业务。似乎可以工作。我真的很惊讶。。所以这只是计时器的类型?嗯,不完全是。问题是,您试图从一个与创建UI组件的线程不同的线程中修改UI组件。您本可以使用System.Timers.Timer,但需要在要修改的UI组件上使用Invoke/BeginInvoke。似乎可以工作。我真的很惊讶。。所以这只是计时器的类型?嗯,不完全是。问题是,您试图从一个与创建UI组件的线程不同的线程中修改UI组件。您可以使用System.Timers.Timer,但需要在要修改的UI组件上使用Invoke/BeginInvoke。