一、应用场景
一窗体(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、在完成操作后调用事件代码,比如以下代码:
   1:  private void button1_Click(object sender, EventArgs e)   2:          {   3:              ///上面完成修改操作   4:              if (CompleteEditEventHandler != null)   5:                  CompleteEditEventHandler(editedRowData, RowIndex);   6:          }
注:这里if(CompleteEditEventHandler!=null)是判断有哪个窗体订阅了这个事件。 3、然后在FormA中调用FormB的时候这样写:
   1:   private void button2_Click(object sender, EventArgs e)   2:          {   3:              DataGridViewRow dr = this.dataGridView1.CurrentRow;   4:              if (dr != null)   5:              {   6:                  string[] edit = { dr.Cells[0].Value.ToString(),dr.Cells[1].Value.ToString(),dr.Cells[2].Value.ToString()};   7:                  MothedForm editForm = new MothedForm(edit, dr.Index);   8:                  editForm.CompleteEditEventHandler += new MothedForm.CompleteEditHandler(editForm_CompleteEditEventHandler);   9:                  editForm.Show();  10:              }  11:          }

这里定义了处理事件,在FormA中的editForm_CompleteEditEventHandler中处理那边触发了事件传递过来的数据,我们要做的就是把接收过来的数据放到我们要显示的控件上。

四、小结

今天有点累,写的不是很多,但是把大概过程写出来了,可能有些问题我写的不够入木三分,也可能有我自己理解不对的地方,也欢迎大家指正。附件传一下详细的测试代码,代码注释很详细。
有问题的也可以跟贴提出,大家一起学习。

转载于:https://blog.51cto.com/nxybcce/1279677

通过事件同步两个窗体之间的数据相关推荐

  1. 用WM_COPYDATA消息来实现两个进程之间传递数据

    文着重讲述了如果用WM_COPYDATA消息来实现两个进程之间传递数据. 进程之间通讯的几种方法: 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.常用的方法有   1.使用内存映 ...

  2. 如何在两个线程之间共享数据

    两个线程之间共享数据的方式 Java 里面进行多线程通信的主要方式就是共享内存的方式,共享内存主要的关注点有两个:可见 性和有序性原子性.Java 内存模型(JMM)解决了可见性和有序性的问题,而锁解 ...

  3. C#中两个窗体间的数据传递

    winform 窗体编程 在两个窗体间传递数据可分为两种: 一:父窗体向子窗体传递. 二:子窗体向父窗体传递. 传递实现的机制: 分别在两个窗体中创建公有属性的设置字段,分别供两个窗口调用. 两种情况 ...

  4. IOS delegate 委托 使用 两个View之间传数据

    今天讲述 delegate 的使用,并给出例子来说明如何使用delegate在两个View之间传送数据 1.建立一个 single view 工程 2.在viecontroller.xib文件里面放上 ...

  5. 两个框架之间的数据类型转换,需要桥接技术

    两个框架之间的数据类型转换,需要桥接技术 在所有的数据类型见面添加__bridge去修饰

  6. Matlab App Designer 【04】使用公共函数在两个App之间传递数据

    使用公共函数在两个App之间传递数据 一.两个App之间传递数据的关键所在 1.在主App中建立公共函数 2.副App需要输入参数 3.一个非常简单的官网案例 二.一个非常简单的例子 1.LPL战队 ...

  7. SQL IN(规定多个值) 和 BETWEEN(选取介于两个值之间的数据范围) 操作符

    IN操作符 IN 操作符用来在WHERE子句中指定条件范围,范围中的每个条件都可以进行匹配. IN 取合法值的清单由逗号进行分隔,并且必须全部括在圆括号内. IN 操作符在WHERE子句中用来指定要匹 ...

  8. java截取字符串两个符号之间的数据

    可以使用Java中的正则表达式来截取两个符号之间的数据.以下是一个示例代码,可以截取字符串中两个指定符号之间的数据: public static String getStringBetweenTwoC ...

  9. linux快速同步多台服务器之间的数据scp和rsync命令用法

    一.scp命令 scp就是secure copy,是用来进行远程文件拷贝的.数据传输使用ssh1,并且和ssh1使用相同的认证方式,提供相同的安全保证.与rcp不同的是,scp会要求你输入密码如果需要 ...

最新文章

  1. python使用pandas计算dataframe中每个分组的分位数极差、分组数据的分位数极差(range)、使用groupby函数和agg函数计算分组的两个分位数
  2. phy芯片测试寄存器_PCIe 5.0首秀!7nm IP方案已成熟!PCIe 5.0的芯片设计有多难?...
  3. Java方法案例--比较两个值是否相等
  4. EasyRTMP CPU占用问题调优(一)
  5. 试用Mono Beta 1.0
  6. 文本显示变量_【RPA课堂】UiPath中的变量、数据类型和组件
  7. Element-UI Form表单 resetFields() 重置表单无效问题
  8. CVPR2020 | 谷歌提出多目标(车辆)跟踪与检测框架 RetinaTrack
  9. 一些iphone开发的资料
  10. 关于NavigateUrl中绑定Eval()方法时出现服务器标记的格式不正确的解决方法
  11. Luogu2606[ZJOI2010] 排列计数
  12. 深入理解android 博客,深入理解Android中ViewGroup
  13. 【速度↑20%模型尺寸↓36%】极简开源人脸检测算法升级
  14. 一位仁兄对于项目管理的精辟见解
  15. linux清理unbuntu无用空间,如何给Ubuntu系统清理垃圾
  16. 大数据要学javaweb吗_大数据运维需要学Java吗?
  17. css 拉伸 resize —— 实现可拉伸的div(含限制拉伸的尺寸)
  18. java-net-php-python-JSP学校教育论坛管理系统开题任务书PPT计算机毕业设计程序
  19. 高频前端面试问题及答案整理
  20. 可能是最全的|适合决策AI研究的自动驾驶模拟器评测(下篇)

热门文章

  1. 介绍一下Seekafile Server
  2. 常用的rm,cp和mv命令
  3. VS2010中经常使用的快捷键
  4. linux中的pppoe拨号上网
  5. Malformed server response 解决方案
  6. Mybatis---总结
  7. iKair:放弃硬件制造,切入上游去“送水”的逻辑
  8. 翻身的废鱼——论PHP从入门到放弃需要多久?15
  9. cocos2d-x-3.1 win32程序-初识源代码(coco2d-x 学习笔记二)
  10. C# 代码注释规范文档