Winform多窗口或多线程传递数据的方法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
前提:假设现在有两个窗口Form1和Form2, Form2是Form1的子窗口,现在需要通过Form2来改变Form1中的内容
效果:
方法一:使用Delegate(代理)
第一步:在Form2中定义代理并声明实例
第二步:在Form1中定义用来代理的函数
第三步:在Form1中生成Form2的实例并将代理赋值给Form2中的代理对象
第四步:在Form2中调用代理
总结:当Form2调用代理对象proEvent时实际上是在调用Form1中的Eventpro函数,由于Eventpro属于Form1,所以赋值成功。
方法二:使用自定义事件
第一步:自定义事件
第二步:在Form2中声明事件对象
第三步:在Form1中定义事件回调函数
第四步:创建Form2的对象实例,并将事件的回调函数添加到事件上(订阅事件)
第五步:在Form2中的按钮上触发事件
总结:当第五步事件被触发,事件对象Events会向所有订阅该事件的函数进行触发,而回调函数EventCallBack是Form1的成员,见第三步,所以数据传递成功。
利弊分析:第一种方法的优点显而易见,代理参数是可以自定义的,如:void EventPro(string Message),其缺点就是,每一个这样的跨窗口调用都需要在子窗口中定义一个代理对象,并在主窗口中赋值相应的函数。相对来说,我偏向于使用自定义事件,首先,不是所有学过winform的人都接触过这部分内容(高端大气上档次),其次,他可以实现一个函数向n个窗口传值,只要给事件添加订阅就可以了,frm.Events += new EventHandler
码的人会发现,事件处理数据的次数往往不止一次,当事件发生时,先由内部处理,再交给外部。我们可以在MyEventArgs的构造函数中先对事件进行处理,再发布出去,看起来更好。