c#进度条控件,子线程修改控件数据。
1.如果你开了一个只线程去修改主线程的控件那么一定会报错,网上的方法也试了十个有九个是不行的,我经过摸索委托发现了线程里面的这个方法,亲测很好用发出来做个总结。
首先界面是这样的
测试代码这么写,注释很清晰
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace LoPrintPersonnelSystemSynchronization
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread thread = new Thread(() =>
{
progressBar1.Value = 0; //清空进度条
for (int i = 0; i <= 100; i++)
{
/*这里直接写会报错的,不能这么干
textBox3.Text = "";
progressBar1.Value += 1;
textBox3.AppendText(i.ToString() + "%");
Thread.Sleep(50);
this.progressBar1.InvokeRequired 这一步很关键就是说判断是不是子线程要修改数据
*/
if (this.progressBar1.InvokeRequired)
{/*data是Invoke接受到的数据,i是传递进去的数据,通过委托把i传给data就能在子线程修改了*/
this.progressBar1.Invoke(new Action<int>
(data => {
this.textBox3.Text = data.ToString() + "%";
this.progressBar1.Value = data;
}),i);
Thread.Sleep(30);
}
}
});
thread.IsBackground = true;
thread.Start();
}
}
}
完成我们来看运行时候的界面
完美运行,界面也可以拖动
如果对你有帮助给我点个赞
谢谢您