欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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";
}
相关标签: C# c#