两个Form窗体之间的关联性问题<跨窗体数据同步>

来源:互联网 发布:js中format 编辑:程序博客网 时间:2024/06/06 04:26

续:多线程委托之跨线程问题分析–在创建窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke(本博客中文章)
异常解决方案:在创建窗口句柄之前,不能在控件上调用 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;} #endregionprivate 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;} #endregionpublic 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();     }}

总结:
重点:要两个窗体之间的关联性。

1 0
原创粉丝点击