通过事件同步两个窗体之间的数据
2011-01-04 21:51
369 查看
一、应用场景
一窗体(FormA)采用datagridview 等数据显示控件显示数据,需要双击其中的数据在另一个窗体(FormB)显示其详细信息并可以进行修改,当其修改完毕后,FormA窗体显示更新过的数据,每当在FromB中添加的数据都能实时的显示在FormA的数据显示控件中。
二、解决方案思考
我们不难看出,其实我们要求的结果就是当FormB完成操作以后能回传FormA一个信息,告诉他完成的什么操作,和是否完成,FormA根据返回的状态信息,来决定自己需要做些什么。
1、设置FormB为ShowDialog方式打开,操作完成后返回窗体状态,FormA通过判断窗体的窗体来决定是否重新刷新数据。
缺点:刷新数据可能需要重新载入数据,对于从数据库中载入来说,大数据量将会是噩梦,而且因为是ShowDialog方式打开,在进行修改等操作时,其他操作其他窗体,必须等待完成。
2、在FormA窗体中定义操作数据显示控件的委托方法,在打开FormB窗体时,将委托实例传递给FromB,在FormB完成修改等操作时,调用委托方法,实现实时修改显示。
缺点:当FormA关闭时,委托调用会失败,但解决了第一种方案的问题。
3、通过事件来同步更新数据,这篇文章主要简单介绍如何通过事件来解决我们这个问题,下面将详细讲下方法。
三、通过事件完成更新操作
步骤:
1、在FormB中定义委托和相应事件,代码如下:
注:这里只是个示例,大家可以根据自己的实际情况来定义委托和事件,来完成相应的操作。
2、在完成操作后调用事件代码,比如以下代码:
[/code]
注:这里if(CompleteEditEventHandler!=null)是判断有哪个窗体订阅了这个事件。
3、然后在FormA中调用FormB的时候这样写:
[/code]
这里定义了处理事件,在FormA中的editForm_CompleteEditEventHandler中处理那边触发了事件传递过来的数据,我们要做的就是把接收过来的数据放到我们要显示的控件上。
四、小结
今天有点累,写的不是很多,但是把大概过程写出来了,可能有些问题我写的不够入木三分,也可能有我自己理解不对的地方,也欢迎大家指正。附件传一下详细的测试代码,代码注释很详细。
有问题的也可以跟贴提出,大家一起学习。
附件:http://u.115.com/file/f4e7af9506
一窗体(FormA)采用datagridview 等数据显示控件显示数据,需要双击其中的数据在另一个窗体(FormB)显示其详细信息并可以进行修改,当其修改完毕后,FormA窗体显示更新过的数据,每当在FromB中添加的数据都能实时的显示在FormA的数据显示控件中。
二、解决方案思考
我们不难看出,其实我们要求的结果就是当FormB完成操作以后能回传FormA一个信息,告诉他完成的什么操作,和是否完成,FormA根据返回的状态信息,来决定自己需要做些什么。
1、设置FormB为ShowDialog方式打开,操作完成后返回窗体状态,FormA通过判断窗体的窗体来决定是否重新刷新数据。
缺点:刷新数据可能需要重新载入数据,对于从数据库中载入来说,大数据量将会是噩梦,而且因为是ShowDialog方式打开,在进行修改等操作时,其他操作其他窗体,必须等待完成。
2、在FormA窗体中定义操作数据显示控件的委托方法,在打开FormB窗体时,将委托实例传递给FromB,在FormB完成修改等操作时,调用委托方法,实现实时修改显示。
缺点:当FormA关闭时,委托调用会失败,但解决了第一种方案的问题。
3、通过事件来同步更新数据,这篇文章主要简单介绍如何通过事件来解决我们这个问题,下面将详细讲下方法。
三、通过事件完成更新操作
步骤:
1、在FormB中定义委托和相应事件,代码如下:
/// <summary> /// 添加新行完成后 /// </summary> /// <param name="newRowData">新行数据</param> public delegate void CompleteAddHandler(string[] newRowData); /// <summary> /// 修改数据完成后 /// </summary> /// <param name="editRowData">修改过后的数据</param> /// <param name="rowIndex">在datagridview中的行索引</param> public delegate void CompleteEditHandler(string[] editRowData, int rowIndex); //以下定义事件 public event CompleteAddHandler CompleteAddEventHandler; public event CompleteEditHandler CompleteEditEventHandler;
注:这里只是个示例,大家可以根据自己的实际情况来定义委托和事件,来完成相应的操作。
2、在完成操作后调用事件代码,比如以下代码:
private void button1_Click(object sender, EventArgs e)
[code] {
///上面完成修改操作
if (CompleteEditEventHandler != null)
CompleteEditEventHandler(editedRowData, RowIndex);
}
[/code]
注:这里if(CompleteEditEventHandler!=null)是判断有哪个窗体订阅了这个事件。
3、然后在FormA中调用FormB的时候这样写:
private void button2_Click(object sender, EventArgs e)
[code] {
DataGridViewRow dr = this.dataGridView1.CurrentRow;
if (dr != null)
{
string[] edit = { dr.Cells[0].Value.ToString(),dr.Cells[1].Value.ToString(),dr.Cells[2].Value.ToString()};
MothedForm editForm = new MothedForm(edit, dr.Index);
editForm.CompleteEditEventHandler += new MothedForm.CompleteEditHandler(editForm_CompleteEditEventHandler);
editForm.Show();
}
}
[/code]
这里定义了处理事件,在FormA中的editForm_CompleteEditEventHandler中处理那边触发了事件传递过来的数据,我们要做的就是把接收过来的数据放到我们要显示的控件上。
四、小结
今天有点累,写的不是很多,但是把大概过程写出来了,可能有些问题我写的不够入木三分,也可能有我自己理解不对的地方,也欢迎大家指正。附件传一下详细的测试代码,代码注释很详细。
有问题的也可以跟贴提出,大家一起学习。
附件:http://u.115.com/file/f4e7af9506
相关文章推荐
- 通过事件同步两个窗体之间的数据
- 通过事件同步两个窗体之间的数据
- 通过事件同步两个窗体之间的数据
- 使用事件和委托再两个窗体之间传递数据
- Oracle中通过Job实现定时同步两个数据表之间的数据
- 使用事件和委托再两个窗体之间传递数据(原创)
- Oracle中通过Job实现定时同步两个数据表之间的数据
- 两个Form窗体之间的关联性问题<跨窗体数据同步>
- winform程序两个窗体间同步数据(一): 静态变量和线程实现
- 在两个ORACLE数据库之间实现数据增量同步
- 通过SQL来伪造两个日期之间的年份数据
- wpf 两个窗体之间的事件响应。
- 通过SQL来伪造两个日期之间的季度数据
- 【转】c#实现在两个窗体(winform)之间传输数据或变量的方法
- C#中窗体之间的数据传递 ----尤其是事件那个好好看看
- 【代码】两个activity之间的互相的切换 数据不能同步的解决办法
- 如何在两个SQLSERVER之间数据同步
- winform程序两个窗体间同步数据(二): 子窗体和线程实现
- 如何在两个SQLSERVER之间实现数据同步
- 用ztree实现node在两个div之间移动(通过两个按钮响应事件)