如何订阅Form的自定义事件
Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 。订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象。这个主体对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。 当一个对象的改变需要同时改变其他对象,而且无需关心具体有多少对象需要改变时,就特别适合用此种模式。本文将演示如何在窗体上自定义一个事件(custom event) :
1 自定义一个CustomEventArgs类
一般自定义的事件都有一个参数,继承自EventArgs.此处我们自定一个CustomEventArgs,类中通过自定义字段来存储参数的值:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace CustomEventsDemo 7 { 8 public class CustomEventArgs:EventArgs 9 { 10 //自定义字段用于存储值 11 public object Tag; 12 public string Message; 13 public CustomEventArgs() 14 { 15 16 } 17 public CustomEventArgs(string message, object tag) 18 { 19 Message = message; 20 Tag = tag; 21 } 22 } 23 }
2 自定义一个事件
接下来我们创建一个FormPublisher窗体,然后用 event EventHandler<CustomEventArgs> customEvent;event EventHandler<CustomEventArgs> customSecondEvent和来自定义两个custom Event事件,它们的事件参数为CustomEventArgs.在窗体加载事件中我们触发两个事件(这个顺序会影响在窗体加载时订阅者的事件响应顺序.如果我们创建一个窗体继承此FormPublisher的话,我们会在此窗体的事件面板中看到下图:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormPublisher : Form 13 { 14 //定义两个事件 15 public event EventHandler<CustomEventArgs> customEvent; 16 public event EventHandler<CustomEventArgs> customSecondEvent; 17 public FormPublisher() 18 { 19 InitializeComponent(); 20 } 21 22 private void FormWithCutomEvent_Load(object sender, EventArgs e) 23 { 24 //确定自定义事件的执行顺序,继承此窗体的子类窗体加载时的默认顺序 25 if (customEvent != null) 26 { 27 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent"); 28 customEvent(this, customEventArgs); 29 } 30 if (customSecondEvent != null) 31 { 32 33 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent"); 34 customSecondEvent(this, customEventArgs); 35 } 36 37 } 38 39 private void button1_Click(object sender, EventArgs e) 40 { 41 42 this.textBox2.AppendText(this.textBox1.Text + "\r\n"); 43 //this.textBox1.Text = ""; 44 if (customSecondEvent != null) 45 { 46 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent"); 47 //触发事件 48 customSecondEvent(this, customEventArgs); 49 } 50 if (customEvent != null) 51 { 52 CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent"); 53 //触发事件 54 customEvent(this, customEventArgs); 55 } 56 } 57 } 58 }
3 订阅事件
下面定义一个FormSubscriber窗体来订阅自定义事件,我们要定义另一个窗体的事件,必须要先实例化那个窗体,否则会调用失败:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormSubscriber : Form 13 { 14 FormPublisher form = null; 15 public FormSubscriber() 16 { 17 InitializeComponent(); 18 //启动2个窗体 19 form = new FormPublisher(); 20 form.Visible = true; 21 //订阅事件 22 form.customSecondEvent += form_customSecondEvent; 23 //订阅事件 24 form.customEvent += form_customEvent; 25 //把发布窗体实例化后传入第二个订阅窗体中,否则不能订阅 26 FormSubScriber2 from2 = new FormSubScriber2(form); 27 from2.Visible = true; 28 } 29 30 void form_customSecondEvent(object sender, CustomEventArgs e) 31 { 32 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 33 } 34 35 void form_customEvent(object sender, CustomEventArgs e) 36 { 37 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 38 } 39 40 private void FormSubscriber_Load(object sender, EventArgs e) 41 { 42 43 } 44 } 45 }
另一个窗体也进行订阅:
1 using System; 2 using System.Collections.Generic; 3 using System.ComponentModel; 4 using System.Data; 5 using System.Drawing; 6 using System.Linq; 7 using System.Text; 8 using System.Windows.Forms; 9 10 namespace CustomEventsDemo 11 { 12 public partial class FormSubScriber2 : Form 13 { 14 15 public FormSubScriber2() 16 { 17 InitializeComponent(); 18 } 19 public FormSubScriber2(FormPublisher form) 20 { 21 InitializeComponent(); 22 //订阅form自定义事件 23 form.customEvent += form_customEvent; 24 } 25 void form_customEvent(object sender, CustomEventArgs e) 26 { 27 this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n"); 28 } 29 30 private void FormSubScriber2_Load(object sender, EventArgs e) 31 { 32 33 } 34 } 35 }
如何订阅Form的自定义事件相关推荐
- Vue(组件间通信:props、自定义事件、全局事件总线、消息订阅与发布)
一.props props不仅可以实现父给子传递信息,还可以进行子给父传递信息 1.父给子传递信息: 父组件中给子组件实例传递信息 子组件利用props进行接收组件传递信息(接收方式有三种:数组.对象 ...
- 如何在JavaScript中使用自定义事件
2019独角兽企业重金招聘Python工程师标准>>> JavaScript 的事件处理是所有浏览器端程序的基本必备技巧.当目标元素的事件被触发时,比如按钮被点击,鼠标移动,或者是表 ...
- 通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程
以下说明可解释自定义的事件的自定义触发过程: 直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件) For ...
- C#:委托和自定义事件
1. 委托概述 "委托"相当于C++中的"函数指针",委托必须与所要"指向"的函数在"参数"和"返回类型&qu ...
- html加上 extjs右键,extjs 处理HTML事件和自定义事件
1. 处理HTML元素的标准事件 HTML元素的标准事件是指mouseover.mousedown.click. blur.focus.change等.在ExtJS中,这些事件的处理如下: 注册一个事 ...
- 「后端小伙伴来学前端了」关于Vue中的自定义事件,组件绑定自定义事件实现通信
傍晚的月亮 前言 原本这篇打算写Vue中的那个全局事件总线的原理,但是发现自己少写了这个自定义事件,不讲明白这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉. 一.v-on指令 要讲自定 ...
- html 自动触发 事件,js自动触发事件自定义事件
在有些情况下,我们需要程序逻辑自动触发元素的事件,例如js提供了click(), form提供了reset(),submit()等方法!在jquery中提供了trigger()方法帮助我们自动触发事件 ...
- 观察者模式和js自定义事件
事件是一种叫做观察者的设计模式,观察者模式由两类对象组成:主体和观察者.主体负责发布事件,同时观察者通过订阅这些事件来观察该主体.拿DOM来说,DOM就是主体,事件处理代码便是观察者. 下面是一个自定 ...
- vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js
模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...
最新文章
- 在Windows10上安装ROS并测试
- 无法分配更多的internet句柄怎么回事_一文精通Java NIO(内容较多,无耐心者勿点)...
- input border IE6 bug
- 手动启动oracle服务教程,windows下手动启动oracle服务
- 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
- 纸的大小图解_图解常见纸张开数尺寸印前小常识
- 大数据面试-04-大数据工程师面试题
- 【转载】固态硬盘的S.M.A.R.T详解
- 项目管理的流程及生命周期
- oracle 账号 jdk下载登录
- 经典的850棋牌游戏搭建教学
- 制订项目进度计划的讨论
- 看完这一篇,智能家居的坑你至少避开80%(上)
- mysql连接泄露 定位_数据库连接泄露一例
- 管理会计计算机应用,管理会计的机会成本
- ⽤户去输⼊⼀个⼈民币⾦额,然后程序会计算如何去⽤20元纸币,10元纸币,5元纸币和⼀元纸币去表⽰这个⼈民币⾦额。要求使⽤最⼩数⽬的纸币。
- 当滑雪这项世界最古老的运动遇上AI
- C语言操作SQLite3简明教程
- 无能狂怒之我对配置类一无所知之自动填充和分页
- 一套开源免费的OA办公管理系统源码,带小程序、生成APP