如何订阅Form的自定义事件
Window Form类有很多的属性/方法和事件,其中事件属于一种发布订阅模式 。订阅发布模式定义了一种一对多的依赖关系,让多个订阅者对象同时监听某一个主体对象。这个主体对象在自身状态变化时,会通知所有订阅者对象,使它们能够自动更新自己的状态。 当一个对象的改变需要同时改变其他对象,而且无需关心具体有多少对象需要改变时,就特别适合用此种模式。本文将演示如何在窗体上自定义一个事件(custom event) :
1 自定义一个CustomEventArgs类
一般自定义的事件都有一个参数,继承自EventArgs.此处我们自定一个CustomEventArgs,类中通过自定义字段来存储参数的值:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace CustomEventsDemo
{
public class CustomEventArgs:EventArgs
{
//自定义字段用于存储值
public object Tag;
public string Message;
public CustomEventArgs()
{ }
public CustomEventArgs(string message, object tag)
{
Message = message;
Tag = tag;
}
}
}
2 自定义一个事件
接下来我们创建一个FormPublisher窗体,然后用 event EventHandler<CustomEventArgs> customEvent;event EventHandler<CustomEventArgs> customSecondEvent和来自定义两个custom Event事件,它们的事件参数为CustomEventArgs.在窗体加载事件中我们触发两个事件(这个顺序会影响在窗体加载时订阅者的事件响应顺序.如果我们创建一个窗体继承此FormPublisher的话,我们会在此窗体的事件面板中看到下图:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace CustomEventsDemo
{
public partial class FormPublisher : Form
{
//定义两个事件
public event EventHandler<CustomEventArgs> customEvent;
public event EventHandler<CustomEventArgs> customSecondEvent;
public FormPublisher()
{
InitializeComponent();
} private void FormWithCutomEvent_Load(object sender, EventArgs e)
{
//确定自定义事件的执行顺序,继承此窗体的子类窗体加载时的默认顺序
if (customEvent != null)
{
CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent");
customEvent(this, customEventArgs);
}
if (customSecondEvent != null)
{ CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent");
customSecondEvent(this, customEventArgs);
} } private void button1_Click(object sender, EventArgs e)
{ this.textBox2.AppendText(this.textBox1.Text + "\r\n");
//this.textBox1.Text = "";
if (customSecondEvent != null)
{
CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customSecondEvent");
//触发事件
customSecondEvent(this, customEventArgs);
}
if (customEvent != null)
{
CustomEventArgs customEventArgs = new CustomEventArgs(this.textBox1.Text, "customEvent");
//触发事件
customEvent(this, customEventArgs);
}
}
}
}
3 订阅事件
下面定义一个FormSubscriber窗体来订阅自定义事件,我们要定义另一个窗体的事件,必须要先实例化那个窗体,否则会调用失败:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace CustomEventsDemo
{
public partial class FormSubscriber : Form
{
FormPublisher form = null;
public FormSubscriber()
{
InitializeComponent();
//启动2个窗体
form = new FormPublisher();
form.Visible = true;
//订阅事件
form.customSecondEvent += form_customSecondEvent;
//订阅事件
form.customEvent += form_customEvent;
//把发布窗体实例化后传入第二个订阅窗体中,否则不能订阅
FormSubScriber2 from2 = new FormSubScriber2(form);
from2.Visible = true;
} void form_customSecondEvent(object sender, CustomEventArgs e)
{
this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n");
} void form_customEvent(object sender, CustomEventArgs e)
{
this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n");
} private void FormSubscriber_Load(object sender, EventArgs e)
{ }
}
}
另一个窗体也进行订阅:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace CustomEventsDemo
{
public partial class FormSubScriber2 : Form
{ public FormSubScriber2()
{
InitializeComponent();
}
public FormSubScriber2(FormPublisher form)
{
InitializeComponent();
//订阅form自定义事件
form.customEvent += form_customEvent;
}
void form_customEvent(object sender, CustomEventArgs e)
{
this.textBox1.AppendText("Message from Publisher " + e.Message + " from " + e.Tag + "\r\n");
} private void FormSubScriber2_Load(object sender, EventArgs e)
{ }
}
}


如何订阅Form的自定义事件的更多相关文章
- vue_组件间通信:自定义事件、消息发布与订阅、槽
自定义事件 只能用于 子组件 向 父组件 发送数据 可以取代函数类型的 props 在父组件: 给子组件@add-todo-event="addTodo" 在子组件: 相关方法中, ...
- javascript 自定义事件 发布-订阅 模式 Event
* javascript自定义事件 var myEvent = document.createEvent("Event"); myEvent.initEvent("myE ...
- Jquery 自定义事件实现发布/订阅
//用户点击logoff按钮时,广播一个自定义事件,给任何需要保存状态的感兴趣的观察者,然后导航到logoff页面 $('#logoff').click(function(){ $.event.tri ...
- 由自定义事件到vue数据响应
前言 除了大家经常提到的自定义事件之外,浏览器本身也支持我们自定义事件,我们常说的自定义事件一般用于项目中的一些通知机制.最近正好看到了这部分,就一起看了下自定义事件不同的实现,以及vue数据响应的基 ...
- 谈谈JS的观察者模式(自定义事件)
呼呼...前不久参加了一个笔试,里面有一到JS编程题,当时看着题目就蒙圈...后来研究了一下,原来就是所谓的观察者模式.就记下来...^_^ 题目 [附加题] 请实现下面的自定义事件 Event 对象 ...
- Javascript之自定义事件
Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...
- C#:委托和自定义事件
1. 委托概述 “委托”相当于C++中的“函数指针”,委托必须与所要“指向”的函数在“参数”和“返回类型”上保持一致; // 定义Person类 public class Person { publi ...
- javascript和jquey的自定义事件小结
“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...
- Javascript事件模型系列(四)我所理解的javascript自定义事件
被我拖延了将近一个月的javascript事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...
随机推荐
- Lookup 组件异常
Lookup组件有两个数据源,一个是上流组件的输出,一个是组件lookup的数据源,这个数据源是在Connection选项卡中进行配置.在开发package的过程中,我发现一个异常,当Lookup数据 ...
- Bmob基础
BaaS是指专为移动应用开发者提供整合云后端的服务.开发者无需过多研究服务器端程序,而只需调用云计算平台提供的API,使用相应SDK,就能迅速完成数据存储.账户管理.消息推送.社交网络整合等功能.本文 ...
- HTML5的学习--performance
HTML5提供的performance接口精确的告诉我们当访问一个网站页面时当前网页每个处理阶段的精确时间(timestamp),以方便我们进行前端分析. 它是浏览器的直接实现,比在网页中用js设置D ...
- Android开发学习清单
目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...
- 测试servlet学习笔记
操作方法: 1.新建工程: File——>new——>Java Project——>TestServlet(工程名称)——>Finish. 2.加载servlet-api.ja ...
- JVM之类加载器中篇
先看一段代码吧! package com.tfdd.test; /** * @desc * @author chenqm * @date 2016年2月15日 */ public class Fina ...
- 14个HTML5实现的效果合集
HTML5可不是什么虚幻的概念,与其高谈阔论的讨论HTML5未来的趋势和价值,不如一起研究一下现在的HTML5可以做出哪些成果,可以让我们做出出色的产品. Form Follows Function就 ...
- ES6 Features系列:Template Strings & Tagged Template Strings
1. Brief ES6(ECMAScript 6th edition)于2015年7月份发布,虽然各大浏览器仍未全面支持ES6,但我们可以在后端通过Node.js 0.12和io.js,而前端则通过 ...
- 使用Python进行GUI操作自动化
前言 本文介绍怎样使用Python进行跨平台的GUI操作的,其中使用的一个工具包是pyautogui,PyAutoGUI可以模拟鼠标的移动.点击.拖拽,键盘按键输入.按住操作,以及鼠标+键盘的热键同时 ...
- 我的vim配置文件
强烈拥护开源精神,高举开源大旗,今天我就分享下我自己结合网上还有自己实际使用配的vimrc,可以给各位参考下,不要见笑,具体说明我在rc里写的也很详细,可以具体看下,也希望可以借这个机会能多认识认识几 ...