我们在跑数据时,有时候需要把跑出来的数据反应到窗体上,如果直接改窗体,多半会遇到多制程制约的情况。所以总结了以下两种方法。
一、控件与控件的对话
在窗体上先拖一个timer控件。这个控件将会和你要改变的控件发生对话,这样不再是不同线程了,找了一个中间人,哈哈。
1、在初始化代码里添加
public MainForm()
{
InitializeComponent();
// 以下三行,根据实际改参数
timer1.Enabled = true;
timer1.Interval = 3000;
timer1.Start();
}
接下来,写tick事件了,也就是你要实现的功能,这样一来,控件和控件都是一个公司的,容易说话,一句话就把事办了。
private void timer1_Tick(object sender, EventArgs e)
{
label8.Text = fileNmList[0]; //此处给控件赋值
}
二、做一个委托,代理你去办事
声明:基础代码来自https://blog.csdn.net/lymsyh/article/details/80102815 我要完善一下。
// 声明一个委托,以准备跨线程修改UI的属性
public delegate void RefreshUI(Control c, object o);
public void refreshUI(Control C, Object o)
{
// 这里可以强转任意控件,然后改他们的方法,参数o也可以是任意复杂结构类型,只要你封装好,拆封好就OK
((ListBox)C).Items.Add (o.ToString());
}
当你要使用这个委托时,也很简单。
this.Invoke(new RefreshUI(refreshUI), new object[] { listBox1, nowtime + "--->" + neirong });
这里举例是向一个列表框里不停的增加值,也可以其他的控件,这是一个简单的委托,对委托头疼的同学,可以通过类似简单的委托,向纵深开展学习,委托并不可怕,哈哈。