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

原创 2016年08月30日 21:47:28

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

form窗体之间传值

  • 2014年12月25日 15:35
  • 46KB
  • 下载

两个窗体(form)间传递参数

窗体之间传递参数总结:方案一: 窗体属于类,可以在窗体类中定义已全局变量,类型为公开、静态的。示例: public static string str ="";       注意是静态变量,如果为: ...

C#中form窗体之间的传递几个方法学习

在windows form之间传值,我总结了有四个方法:全局变量、属性、窗体构造函数和delegate。 第一个全局变量: 这个最简单,只要把变量描述成static就可以了,在form2中直接引用...

C# 两个窗体之间互相传参

  • 2010年12月24日 17:17
  • 44KB
  • 下载

Visual Studio 中两个窗体(WinForm)之间相互传值的方法

编写WinowsForm应用程序时,实现两个窗体之间相互传递值的方法其实很简单。以下用一个例子说明:在名为FormMain主窗体运行过程中利用名为FormInfo窗体,获取用户输入信息,并将这些信息返...

Javascript 两个窗体之间传值实现代码

javascript中还有一个函数window.showModalDialog也可以打开一个新窗体,不过他打开的是一个模态窗口,那么如何在父窗体和子窗体之间传值呢?我们先看该函数的定义:vReturn...

Javascript showModalDialog两个窗体之间传值

Javascript 两个窗体之间传值实现代码 javascript中还有一个函数window.showModalDialog也可以打开一个新窗体,不过他打开的是一个模态窗口,那么如何在父窗体和...

C#两个窗体之间值通信

C#两个或者多个窗体之间值得传递方法有很多种,大致可以分为单向传递和双向传递两种,后者当然更加灵活一点,对于C#的特点体现的也最好。这里总结两种最为常用的方法,通过属性设置和事件委托进行通信。 1、事...
  • Amrser
  • Amrser
  • 2015年04月10日 21:39
  • 347
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:两个Form窗体之间的关联性问题<跨窗体数据同步>
举报原因:
原因补充:

(最多只允许输入30个字)