程序猿

弱水三千只取一瓢

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

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

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

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_23833037/article/details/52373406
个人分类: Csharp语言
上一篇在键盘输入文字时,如何判别只输入数字类型?
下一篇java环境变量详解---找不到或无法加载主类
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭