C#winform 界面刷新
程序员文章站
2022-06-10 18:31:01
...
1. 跨线程界面更新
1.1通过委托更新界面
public delegate void RefreshInterface(int num);//创建委托,含有一个参数num
bool MyThreadIsRun = false;//用来控制线程状态
private Thread MyThread = null; //创建线程
private void button1_Click(object sender, EventArgs e)
{
MyThreadIsRun = !MyThreadIsRun;//切换线程状态
MyThread = new Thread(Method);//实例化线程对象传递参数
MyThread.Start();//开启线程
}
/// <summary>
/// 线程所需方法
/// </summary>
public void Method()
{
RefreshInterface dele = new RefreshInterface(RefreshInterfaceMethod);//给委托对象传递值
for (int i = 0; i < 1000000; i++)
{
if (!MyThreadIsRun)
break;//当线程状态为false则退出循环
this.Invoke(dele, i);//执行指定委托,将i的值传递给委托执行方法,更新界面数据
}
}
/// <summary>
/// 委托所需方法
/// </summary>
/// <param name="num">接收传递的值</param>
public void RefreshInterfaceMethod(int num)
{
textBox1.Text = num.ToString();//给显示框赋值
}
/// <summary>
/// 关闭窗体事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
MyThreadIsRun = false;//关闭线程
//保证程序退出前,关闭线程(之所以有这个提示框,是为了线程彻底关闭,否则当关闭时,线程可能在执行过程中会出错)
MessageBox.Show("谢谢使用");
}
1.2 通过Invoke更新
//1.通过点击时间开启线程
private void btn_Click(object sender, EventArgs e)
{
Thread th = new Thread(A);
th.Start();
}
//2.在线程中使用Invoke更新界面
public void A()
{
//循环更新界面20次,每次睡眠200毫秒,
for (int i = 0; i < 20; i++)
{
Invoke(new EventHandler(delegate
{
label.Text = "关闭" + i;
}));
Thread.Sleep(200);
}
}
2 跨窗体更新界面
2.1 直接更新
Application.OpenForms[“窗体名称”].Controls[“控件名称”].Visible = true;
2.2 获取窗体实例对象更新
//1.在A中实例化B的对象,调用B窗体,传递A窗体实例化对象
B B = new B(this);
B.ShowDialog();
//2.在B窗体的构造函数获取A窗体的实例化对象
A _a;
public B(A a)
{
InitializeComponent();
_a = a;
}
//3.在B中使用A的实例,更新A界面的数据和属性
public void MyFun()
{
_a.lbl1.Text = "更新后Text";
}