我这里写一个线程里创建一个窗体调用父窗体的方法
private void button4_Click(object sender, EventArgs e) { button4.Text = "正在加载中"; button4.Enabled = false; Thread t = new Thread(new ThreadStart(open)); // 创建线程 t.Start(); //线程开始 } public void ssss() { button4.Text = "确认"; button4.Enabled = true; } public delegate void xxxxx(); //定义委托 public void ssxx() //winfrom 中不管是不是同一个窗体跨线程访问都会报安全问题,所有需要委托窗体线程来做 { xxxxx x = new xxxxx(ssss); this.Invoke(x); } public void open() { List<string> ls = new List<string>(); for (int i = 0; i < dataGridView1.Rows.Count; i++) { if (Convert.ToBoolean(dataGridView1.Rows[i].Cells[0].Value)) { // MessageBox.Show(dataGridView1.Rows[i].Cells[2].Value.ToString()); ls.Add(dataGridView1.Rows[i].Cells[1].Value.ToString()); } } if (ls.Count <= 0) { MessageBox.Show("请先选择"); ssxx(); return; } List<string> lstr = Class1.readzswj(mo.dr, mo.gz, ls); if (lstr.Count <= 0) { MessageBox.Show("选中文件中没有表通过验证,请重新选择"); ssxx(); return; } xxxxx x = new Form4.xxxxx(ssxx); //与我另一篇文章一样 Form12 f = new Form12(mo,ls,x,lstr); f.ShowDialog(); //注意这里要用是这个 不能只是show() 线程做完事情后自动释放,这里窗体也会被释放掉 }