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的自定义事件相关推荐

  1. Vue(组件间通信:props、自定义事件、全局事件总线、消息订阅与发布)

    一.props props不仅可以实现父给子传递信息,还可以进行子给父传递信息 1.父给子传递信息: 父组件中给子组件实例传递信息 子组件利用props进行接收组件传递信息(接收方式有三种:数组.对象 ...

  2. 如何在JavaScript中使用自定义事件

    2019独角兽企业重金招聘Python工程师标准>>> JavaScript 的事件处理是所有浏览器端程序的基本必备技巧.当目标元素的事件被触发时,比如按钮被点击,鼠标移动,或者是表 ...

  3. 通过c# 实现自定义属性改变触发自定义事件 ,理解自定义事件及其触发过程

    以下说明可解释自定义的事件的自定义触发过程: 直接上代码,内含说明(界面是两个文本框textbox1,textbox2,和一个button1,界面的Load事件,button的click事件) For ...

  4. C#:委托和自定义事件

    1. 委托概述 "委托"相当于C++中的"函数指针",委托必须与所要"指向"的函数在"参数"和"返回类型&qu ...

  5. html加上 extjs右键,extjs 处理HTML事件和自定义事件

    1. 处理HTML元素的标准事件 HTML元素的标准事件是指mouseover.mousedown.click. blur.focus.change等.在ExtJS中,这些事件的处理如下: 注册一个事 ...

  6. 「后端小伙伴来学前端了」关于Vue中的自定义事件,组件绑定自定义事件实现通信

    傍晚的月亮 前言 原本这篇打算写Vue中的那个全局事件总线的原理,但是发现自己少写了这个自定义事件,不讲明白这个自定义事件的操作,不好写全局事件原理,于是就有了这篇文章拉. 一.v-on指令 要讲自定 ...

  7. html 自动触发 事件,js自动触发事件自定义事件

    在有些情况下,我们需要程序逻辑自动触发元素的事件,例如js提供了click(), form提供了reset(),submit()等方法!在jquery中提供了trigger()方法帮助我们自动触发事件 ...

  8. 观察者模式和js自定义事件

    事件是一种叫做观察者的设计模式,观察者模式由两类对象组成:主体和观察者.主体负责发布事件,同时观察者通过订阅这些事件来观察该主体.拿DOM来说,DOM就是主体,事件处理代码便是观察者. 下面是一个自定 ...

  9. vue中 点击事件的写法_vue中的事件:原生事件与自定义事件__Vue.js

    模板编译 processAttrs 对于ast attributes处理(v-on/@) 利用onRE与dirRE来捕获事件 这里最重要的就是dynamic的判断,vue中可以用动态参数来命名事件名称 ...

最新文章

  1. 在Windows10上安装ROS并测试
  2. 无法分配更多的internet句柄怎么回事_一文精通Java NIO(内容较多,无耐心者勿点)...
  3. input border IE6 bug
  4. 手动启动oracle服务教程,windows下手动启动oracle服务
  5. 左神算法:分别用递归和非递归方式实现二叉树先序、中序和后序遍历(Java版)
  6. 纸的大小图解_图解常见纸张开数尺寸印前小常识
  7. 大数据面试-04-大数据工程师面试题
  8. 【转载】固态硬盘的S.M.A.R.T详解
  9. 项目管理的流程及生命周期
  10. oracle 账号 jdk下载登录
  11. 经典的850棋牌游戏搭建教学
  12. 制订项目进度计划的讨论
  13. 看完这一篇,智能家居的坑你至少避开80%(上)
  14. mysql连接泄露 定位_数据库连接泄露一例
  15. 管理会计计算机应用,管理会计的机会成本
  16. ⽤户去输⼊⼀个⼈民币⾦额,然后程序会计算如何去⽤20元纸币,10元纸币,5元纸币和⼀元纸币去表⽰这个⼈民币⾦额。要求使⽤最⼩数⽬的纸币。
  17. 当滑雪这项世界最古老的运动遇上AI
  18. C语言操作SQLite3简明教程
  19. 无能狂怒之我对配置类一无所知之自动填充和分页
  20. 一套开源免费的OA办公管理系统源码,带小程序、生成APP

热门文章

  1. FT报源检测到目标无法恢复解决过程
  2. IP Header包
  3. 【js】callback时代的变更
  4. 明日微博软件的NABCD分析
  5. 基础知识--:before伪元素和:after伪元素
  6. 自动删除指定文件夹下N天前文件的批处理
  7. android layout属性介绍
  8. Makefile写法入门心得
  9. 49.SCVMM管理下的Hyper-V到Azure的异地(Azure)容灾
  10. 区块链最积极的布局者:国内5大银行已将“区块链”应用到5大场景当中