您的位置:首页 > 其它

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

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


总结:

重点:要两个窗体之间的关联性。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息