两个Form窗体之间的关联性问题<跨窗体数据同步>
2016-08-30 21:47
351 查看
续:多线程委托之跨线程问题分析–在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(本博客中文章)
异常解决方案:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
主窗体代码:
子窗体代码:
在子窗体中新构建一个全新的构造函数,参数为主窗体。
实例代码:
功能:子窗体输入sql判断条件,点击确认按钮同时,同步刷新主窗体的DataGridView控件的表格数据。
第一种两个窗体之间使用普通调用代码
子窗体代码:
主窗体代码:
第二种两个窗体之间使用多线程代码
子窗体代码:
主窗体代码:
第一种Invoke
第二种Invoke
总结:
重点:要两个窗体之间的关联性。
异常解决方案:在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke
如何构建两个窗体之间的关联性?
使用构造函数去构建两个窗体之间的关联:主窗体代码:
private void ChaXun_Click(object sender, EventArgs e)//跨窗体重点 { //实例化子窗体,传递参数为当前类。 YuanGonChaXun YGCX = new YuanGonChaXun(this); YGCX.Show(this); }
子窗体代码:
在子窗体中新构建一个全新的构造函数,参数为主窗体。
//声明一个主窗体变量,(切记不要new,因为new之后是一个全新的主窗体,不是原本的那个主窗体) KGWrenyuanGuanLi kgw = null; public YuanGonChaXun(KGWrenyuanGuanLi KGW) {//需要新建一个全新的构造函数,构造函数的参数是接收“原本主窗体” InitializeComponent(); //把“原本的主窗体”赋值给“声明的主窗体”。 kgw = KGW; }
实例代码:
功能:子窗体输入sql判断条件,点击确认按钮同时,同步刷新主窗体的DataGridView控件的表格数据。
第一种两个窗体之间使用普通调用代码
子窗体代码:
#region 跨窗体重点 //声明一个主窗体变量,(切记不要new,因为new之后是一个全新的主窗体,不是原本的那个主窗体) KGWrenyuanGuanLi kgw = null; public YuanGonChaXun(KGWrenyuanGuanLi KGW) {//需要新建一个全新的构造函数,构造函数的参数是接收“原本主窗体” InitializeComponent(); //把“原本的主窗体”赋值给“声明的主窗体”。 kgw = KGW; } #endregion private void New1()//普通方法调用 { sqlconnent co = new sqlconnent(); SqlConnection conn = co.connent(); conn.Open(); try { DataTable NewDt = new DataTable(); DataSet ds = new DataSet(); string strselect = "select * from KeHuBiao where 客户名称 = '" + textBox2.Text + "'"; SqlDataAdapter da = new SqlDataAdapter(strselect, conn); da.Fill(ds); kgw.NewTable1(ds.Tables[0]); } catch (Exception ee) { MessageBox.Show(ee.Message.ToString()); } finally { conn.Close(); } }
主窗体代码:
public void NewTable1(DataTable dt)//普通调用 { this.dataGridView1.DataSource = dt; }
第二种两个窗体之间使用多线程代码
子窗体代码:
#region 跨窗体重点 //声明一个主窗体变量,(切记不要new,因为new之后是一个全新的主窗体,不是原本的那个主窗体) KGWrenyuanGuanLi kgw = null; public YuanGonChaXun(KGWrenyuanGuanLi KGW) {//需要新建一个全新的构造函数,构造函数的参数是接收“原本主窗体” InitializeComponent(); //把“原本的主窗体”赋值给“声明的主窗体”。 kgw = KGW; } #endregion public delegate void newtable2(string textbox2); public newtable2 table2; private void New2()//多线程调用 { table2 = new newtable2(kgw.NewTable2); Thread th = new Thread(new ThreadStart(delegate { table2(textBox2.Text);//第一种invoke调用(可行) this.Invoke(table2, new object[] {textBox2.Text });//第二种invoke调用(可行) //两种inovke二选一执行 })); th.IsBackground = true; th.Start(); }
主窗体代码:
第一种Invoke
public void NewTable2(string textBox2)//多线程调用 { sqlconnent co = new sqlconnent(); SqlConnection con = co.connent(); con.Open(); try { if (this.Created) { this.Invoke(new ThreadStart(delegate { string strselect = "select * from KeHuBiao where 客户名称 = '" + textBox2 + "'"; DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(strselect, con); da.Fill(ds); this.dataGridView1.DataSource = ds.Tables[0]; })); } } catch (Exception ee) { MessageBox.Show(ee.Message.ToString()); } finally { con.Close(); } }
第二种Invoke
public void NewTable2(string textBox2)//多线程调用 { sqlconnent co = new sqlconnent(); SqlConnection con = co.connent(); con.Open(); try { string strselect = "select * from KeHuBiao where 客户名称 = '" + textBox2 + "'"; DataSet ds = new DataSet(); SqlDataAdapter da = new SqlDataAdapter(strselect, con); da.Fill(ds); this.dataGridView1.DataSource = ds.Tables[0]; } catch (Exception ee) { MessageBox.Show(ee.Message.ToString()); } finally { con.Close(); } }
总结:
重点:要两个窗体之间的关联性。
相关文章推荐
- 通过事件同步两个窗体之间的数据
- <form:checkboxes>数据回显问题
- <学习笔记>王爽汇编语言__处理数据的两个基本问题
- 两个Activity之间传递List<T>数据
- 新阶乘问题,有两个数a,b(a>=b),求a到b之间所有数的阶乘之和;数据有多组.
- 通过事件同步两个窗体之间的数据
- 通过事件同步两个窗体之间的数据
- 通过事件同步两个窗体之间的数据
- 太高兴了。终于搞定了两个Oracle数据库之间的同步问题,特别是ArcSde元数据库的同步
- 如何在两个SQLSERVER之间数据同步
- 如何在两个SQLSERVER之间数据同步
- 关于两个窗体之间交换数据
- Android两个Activity之间传递List<Object>对象
- 2个进程之间数据的同步问题
- 急需解决------关于在两个窗体之间传递参数的问题
- 如何在两个SQLSERVER之间实现数据同步
- 两个Form窗口之间的传值(父->子)(子->父)
- 如何在两个SQLSERVER之间实现数据同步
- 如何在两个SQLSERVER之间数据同步
- 两个Activities之间的数据传递问题解决1