Winforms 如何在计时器上更新WinForm标签?
我无法更新我的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
//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。