所以我正在尝试向窗体添加控件,而我正在使用一种解决方法,所以我可以通过静态函数添加控件,我这样做:
Control c = this;
Button b = new Button();
//....
c.Controls.Add(b);
这样可行,所以我一直在使用此方法添加控件。但现在我正在使用计时器而且它不起作用
Control c = this;
Timer t = new Timer(500);
t.Elapsed += new ElapsedEventHandler(t_Elapsed);
public static void t_Elapsed(object sender, ElapsedEventArgs e)
{
Button b = new Button();
//...
c.Controls.Add(b);
}
运行函数t_Elapsed
,正在执行代码,但行c.Controls.Add(b)
无效。
答案 0 :(得分:0)
您的代码存在一些问题:
为什么要使用静态事件处理程序,然后在首次使用非静态事件处理程序时使用解决方法来访问实例变量?
您使用的计时器类是System.Timers.Timer
,还有几个不同的计时器类,行为略有不同。可以找到比较here。
当您以任何方式修改UI时,您必须从UI线程执行此操作。 System.Timers.Timer
可以调用UI线程上的事件处理程序,但前提是您提供了同步对象,该对象是实现ISynchronizeInvoke
接口的任何对象,例如Form
。
如果t.SynchronizingObject = this
引用this
类的实例,则可以使用Form
设置同步对象。
答案 1 :(得分:0)
您必须访问创建它们的线程上的控件。
您的计时器已用事件将在与UI的其他线程上触发,因此您需要将该调用封送到UI线程。
可以使用Invoke
:
void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.BeginInvoke((Action)delegate
{
Button b = new Button();
c.Controls.Add(b);
});
}