关闭

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

标签: 函数数据解决方案多线程控件
821人阅读 评论(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
查看评论

关于跨窗体调用控件

<br />比如两个窗体FORM1和FORM2,在FORM2中想要调用FORM1中的DATAGRIDVIEW控件,设置某一列为隐藏<br /> <br />在FORM2类中<br />FORM1 frm1=(FORM1)Application...
  • zoohouse
  • zoohouse
  • 2010-08-26 20:08
  • 292

C#中两个窗体将相互跳转

转自:http://blog.csdn.net/allenjy123/article/details/7727500 首先 program.cs 中 [csharp] view plain copy [STAThread]   sta...
  • u012252959
  • u012252959
  • 2016-01-19 17:21
  • 840

delphi窗体之间的相互传值

效果图如下所示 Form1代码 //定义一个用户信息类 type   TUsersInfo=class     //声明三个全局变量     public        UserName:...
  • wang463584281
  • wang463584281
  • 2014-03-22 18:17
  • 1019

C#(WIN FORM)两个窗体间之间的相互操作

两个窗体 FrmChild,Frmparent  Frmparent  弹出FrmChild  通过FrmChild窗体可以直接操作  Frmparent  1、 先设置Frmparent 窗体中 要操作的控件属性中的Modifie...
  • kllxyu
  • kllxyu
  • 2013-08-30 13:33
  • 2217

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

编写WinowsForm应用程序时,实现两个窗体之间相互传递值的方法其实很简单。以下用一个例子说明:在名为FormMain主窗体运行过程中利用名为FormInfo窗体,获取用户输入信息,并将这些信息返回给FormMain 1. FormMain和FormInfo 点击“修改...”按钮,显示Fo...
  • rockyzee
  • rockyzee
  • 2014-03-18 19:26
  • 2426

C#的Winform窗体之间的传值

本人做Winform比较少,所以关于Winform窗体间的传值方式知道的也就这么几种。 1.通过构造函数进行传值。 实现代码如下: 在窗体Form2中 int value1; string value2; public Form2(int value1,str...
  • a631464421
  • a631464421
  • 2015-03-26 21:04
  • 4713

winform程序两个窗体间同步数据(二): 子窗体和线程实现

一 : 显示效果 二 代码 1  入口程序 using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; namespace WindowsForms...
  • nocomment_84
  • nocomment_84
  • 2017-02-02 11:54
  • 508

C#两个窗体之间值通信

C#两个或者多个窗体之间值得传递方法有很多种,大致可以分为单向传递和双向传递两种,后者当然更加灵活一点,对于C#的特点体现的也最好。这里总结两种最为常用的方法,通过属性设置和事件委托进行通信。 1、事件委托        我们可以做两个窗体...
  • Amrser
  • Amrser
  • 2015-04-10 21:39
  • 441

JAVA两窗体之间的传值

-----------------父界面部分代码---------------      ResultSet   rs=null;           public   static ...
  • li5066520
  • li5066520
  • 2015-09-28 02:03
  • 434

c# 用委托和事件实现不同窗体间的通讯(一)

C# 中的“事件”是当对象满足一定条件,发生某些事情时,类向该类的客户提供通知的一种方法。使用事件,拥有该事件的对象不必知道需要通知谁,一旦满足了某个条件,将自动调用该事件,正确通知每个需要通知的对象。通过使用事件,提高了程序的模块化程度。   例子:通过form1打开form2...
  • lekelaier_msn
  • lekelaier_msn
  • 2007-06-24 13:38
  • 4041
    个人资料
    • 访问:98399次
    • 积分:1499
    • 等级:
    • 排名:千里之外
    • 原创:53篇
    • 转载:17篇
    • 译文:0篇
    • 评论:17条
    最新评论