关闭

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

标签: 函数数据解决方案多线程控件
481人阅读 评论(1) 收藏 举报
分类:

续:多线程委托之跨线程问题分析–在创建窗口句柄之前,不能在控件上调用 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;
} 
#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();
     }
}

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

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:49360次
    • 积分:1028
    • 等级:
    • 排名:千里之外
    • 原创:43篇
    • 转载:14篇
    • 译文:0篇
    • 评论:6条