步步为营-44-窗体之间传值--观察者模式
说明 :观察者模式又叫发布-订阅模式,其中又涉及到中介者模式
1 结构
2 创建Main窗体(中介者),ChildForm1(发布者),ChildForm2(订阅者),ChildForm3(订阅者),
2.1 ChildForm1中添加按钮,当按钮被点击是ChildForm2(订阅者),ChildForm3(订阅者),的文本框汇中获取信息
2.2 定义接口
public interface IMessageOn
{
void RecieveMsg(string str);
}
2.3 在发布者ChildForm1中创建MessageOnList集合
2.4 订阅者ChildForm2,ChildForm3中实现接口
public void RecieveMsg(string str)
{
this.txtGetTime.Text = str;
}
2.5 中介者Main把 订阅者放入到发布者的MessageONList集合中
ChildForm2 frm2 = new ChildForm2();
//2把订阅者放入到发布者的MessageONList集合中
frm1.MessageOnList.Add(frm2);
//3显示窗体
frm2.Show();
2.6 遍历集合,通知所有的观察者
foreach (var MessageOn in MessageOnList)
{
MessageOn.RecieveMsg(txtSendMsg.Text);
}
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2把订阅者放入到发布者的MessageONList集合中 frm1.MessageOnList.Add(frm2);//3显示窗体 frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);frm3.Show();}} }
Main
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 中介者_订阅者 {public interface IMessageOn{void RecieveMsg(string str);} }
IMessageOn
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}}} }
ChildForm1
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}public void RecieveMsg(string str){this.txtGetTime.Text = str;}} }
ChildForm2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}public void RecieveMsg(string str){this.txtGetTime.Text = str;} } }
ChildForm3
通过中介者,将发布者和订阅者实现了解耦
3 通过委托实现
3.1 在ChildForm1中声明委托类型
public delegate void SendMsgDel(string sendMsg);
3.2 在ChildForm1中定义委托实例
//02-02定义委托实例
public SendMsgDel SendMsgDelInstance { set; get; }
3.3 在ChildForm2中定义委托实现方法
public void RecieveMsgByDel(string str)
{
this.txtGetTime.Text = str;
}
3.4 Main中将观察者的方法注册到ChildForm1中的委托中去
frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;
3.5 单击按钮触发事件
private void btnDelegate_Click(object sender, EventArgs e)
{
SendMsgDelInstance(txtSendMsg.Text);
}
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2把订阅者放入到发布者的MessageONList集合中 frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;//3显示窗体 frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;frm3.Show();}} }
Main
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 中介者_订阅者 {public interface IMessageOn{void RecieveMsg(string str);} }
IMessageOn
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {//02-01定义委托public delegate void SendMsgDel(string sendMsg);public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}#region 01通过发布者模式实现public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}} #endregion#region 02通过委托实现//02-02定义委托实例public SendMsgDel SendMsgDelInstance { set; get; }private void btnDelegate_Click(object sender, EventArgs e){SendMsgDelInstance(txtSendMsg.Text);} #endregion} }
ChildForm1
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;} #endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion} }
ChildForm2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;}#endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion } }
ChildForm3
但是,使用委托有一缺陷==>不安全,
例如,在Main中创建完窗体后直接加一句
frm1.SendMsgDelInstance("委托实现不安全");
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2-1把订阅者放入到发布者的MessageONList集合中---接口形式注册 frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;frm1.SendMsgDelEven += frm2.RecieveMsgByEvent;//3显示窗体 frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去----委托形式注册frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;//2-3将观察者的方法注册到事件中去----事件形式注册frm1.SendMsgDelEven += frm3.RecieveMsgByEvent;frm3.Show();frm1.SendMsgDelInstance("委托实现不安全");//frm1.SendMsgDelEven("事件事件安全"); }} }
View Code
4通过事件实现
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class Main : Form{public Main(){InitializeComponent();}private void btnOpenForm_Click(object sender, EventArgs e){//1创建窗体ChildForm1 frm1 = new ChildForm1();frm1.Show();ChildForm2 frm2 = new ChildForm2(); //2-1把订阅者放入到发布者的MessageONList集合中---接口形式注册 frm1.MessageOnList.Add(frm2);frm1.SendMsgDelInstance += frm2.RecieveMsgByDel;frm1.SendMsgDelEven += frm2.RecieveMsgByEvent;//3显示窗体 frm2.Show();ChildForm3 frm3 = new ChildForm3();frm1.MessageOnList.Add(frm3);//2-2将观察者的方法注册到委托中去----委托形式注册frm1.SendMsgDelInstance += frm3.RecieveMsgByDel;//2-3将观察者的方法注册到事件中去----事件形式注册frm1.SendMsgDelEven += frm3.RecieveMsgByEvent;frm3.Show();frm1.SendMsgDelInstance("委托实现不安全");//frm1.SendMsgDelEven("事件事件安全"); }} }
Main
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace 中介者_订阅者 {public interface IMessageOn{void RecieveMsg(string str);} }
IMessageOn
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {//02-01定义委托public delegate void SendMsgDel(string sendMsg);public partial class ChildForm1 : Form{public ChildForm1(){InitializeComponent();MessageOnList = new List<IMessageOn>();}#region 01通过发布者模式实现public List<IMessageOn> MessageOnList { set; get; }private void btnSendTime_Click(object sender, EventArgs e){foreach (var MessageOn in MessageOnList){MessageOn.RecieveMsg(txtSendMsg.Text);}} #endregion#region 02通过委托实现//02-02定义委托实例public SendMsgDel SendMsgDelInstance { set; get; }private void btnDelegate_Click(object sender, EventArgs e){SendMsgDelInstance(txtSendMsg.Text);} #endregion#region 03事件实现public event SendMsgDel SendMsgDelEven;private void btnEvent_Click(object sender, EventArgs e){if (SendMsgDelEven!=null){SendMsgDelEven(txtSendMsg.Text);}}#endregion} }
ChildForm1
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm2 : Form,IMessageOn{public ChildForm2(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;} #endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion#region 03事件实现方法public void RecieveMsgByEvent(string str){this.txtGetTime.Text = str;}#endregion} }
ChildForm2
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 中介者_订阅者 {public partial class ChildForm3 : Form,IMessageOn{public ChildForm3(){InitializeComponent();}#region 01接口实现发布者模式 方法public void RecieveMsg(string str){this.txtGetTime.Text = str;}#endregion#region 02委托实现方法public void RecieveMsgByDel(string str){this.txtGetTime.Text = str;}#endregion#region 03事件实现方法public void RecieveMsgByEvent(string str){this.txtGetTime.Text = str;}#endregion } }
View Code
转载于:https://www.cnblogs.com/YK2012/p/6806842.html
步步为营-44-窗体之间传值--观察者模式相关推荐
- 窗体之间传值的暴力方法
窗体之间传值可以使用观察者模式,但是如果设置一个static(静态)变量,好像更简单.对于小型程序感觉是可用的: 在前一个窗体上: public static string x: //试验窗体切换的代 ...
- pyqt5窗口之间传递信号_pyQT5 实现窗体之间传值的示例
准备 一个MainWindow和一个WidgetForm,总代码如下 # -*- coding: utf-8 -*- from PyQt5 import QtWidgets from main_win ...
- C#使用事件方式Winform窗体之间传值
[摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...
- windows form (窗体) 之间传值
在windows form之间传值,我总结了有四个方法:全局变量.属性.窗体构造函数和delegate. 第一个全局变量: 这个最简单,只要把变量描述成static就可以了,在form2中直接引用fo ...
- WinForm窗体之间传值
当程序需要将一个窗体中的一些信息传给另一个窗体并让其使用时,就需要用到这个知识点 方法一:通过接受参数的窗体的构造函数传值 例:现有Form1和Form2两个窗体,二者都包含一个文本框,Form1还包 ...
- c#父窗体子窗体之间传值
c#窗体传值 1. 父窗体向子窗体传值 父窗体Form1程序 //使其成为主窗体Form1的一个属性,private string text;public string Text{get { retu ...
- c# 不同窗体之间传值和调用
1.子窗体事件刷新父窗体界面值 子窗体定义委托和事件 //声明一个委托public delegate void DisplayUpdateDelegate(string str);//声明事件publ ...
- 关于主窗体与子窗体之间的通信以及面向对象思想的一些应用
该写几篇文章啦~ 最近在搞winForm,开始的时候遇到点问题.其实也不算什么大问题,归结起来还是主窗体与子窗体之间传值.通信的问题: 这个问题在网上的解决方案有很多,一搜一大堆,比如将主窗体自身作为 ...
- java swing 传值_java swing 窗体之间怎么传值?
展开全部 传递一个对象过去32313133353236313431303231363533e58685e5aeb931333332623366:package org.somken; import j ...
最新文章
- 数据可视化完美指南-R-Python
- windows下redis 和 hiredis的编译与使用
- python-map函数
- 锤子剪刀布 (20)
- python代码打开可执行文件_将自己的Python代码打包成exe文件(更换设备可运行的)...
- Step by Step to download a material from ERP via request download
- html 图片 保持长宽比,实现图片在页面中宽高一直保持16:9比例的方法
- 使用Spring Boot Actuator、Jolokia和Grafana实现准实时监控
- JavaScript对象中的this属性
- 一篇文章带你快速入门JavaScript(自学者福利)
- 彻底与高通谈崩?苹果被爆计划自研5G调制解调器
- Julia的学习资料从哪里找?
- balenaEtcher-1.5.70可能是最好用的镜像写U盘工具 img to usb dmg to usb支持多种格式内附截图介绍多平台均有
- digester_Apache Digester示例–轻松配置
- 计算机双系统,细说如何给电脑安装双系统
- FAN73893MX 350mA-650mA 高压600V 用于高压、高速驱动 MOSFET和IGBT 三相半桥栅极驱动 IC
- Matlab——图形绘制——三维立体图形 剔透玲珑球 动态图——彗星状轨迹图
- win10安装vivado + vitis 2019.2 教程
- 大数据技术原理与应用(7-11)-TYUT
- 我和java这两年--青石桥
热门文章
- [转载] CSS模块化【封装-继承-多态】
- C++用数组和链表分别实现Queue
- latex 插图解释_大O符号-只需插图和视频即可解释
- Spring Cloud应用开发(四:服务容错保护)
- java登陆界面连接数据库_java 登陆界面怎么写,连接数据库后
- Servlert接口的doGet()、doPst()方法
- mysql 触发器死循环_请教如何避免该条触发器的死循环
- PRD 的编写和修改注意事项
- 浅谈同一家公司多个系统,共用登录用户名和密码
- react es6+ 代码优化之路-1