如何订阅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事件模型系列终于迎来了第四篇,也是我计划中的最后一篇,说来太惭愧了,本来计划一到两个星期写完的,谁知中间遇到了很多事情,公司的个人的,搞的自己心烦意乱浮躁了一 ...
随机推荐
- Xdebug 配置
到官网 http://www.xdebug.com/download.php 下载 找到对应PHP版本的 Xdebug ,后面带 TS 的为线程安全,本机环境为 win7 64 + php-5.5.1 ...
- 深入理解PHP内核(十)变量及数据类型-类型提示的实现
原文链接:http://www.orlion.ga/253/ PHP是弱类型语言,向方法传递参数时也并不严格检查数据类型.不过有时候需要判断传递到方法中的参数,为此PHP中提供了一些函数来判断数据的类 ...
- javascript类型系统——日期Date对象
× 目录 [1]静态方法 [2]构造函数 [3]实例方法 前面的话 Date对象是javascript语言中内置的数据类型,用于提供日期和时间的操作接口.Date对象是在早期java中的java.ut ...
- CSDN 论坛招聘区是不是有潜规则?在Cnblog招个人试试...
CSDN 论坛招聘区是不是有潜规则? 在招聘区发了两个招聘贴都被删掉了... 而且没有任何提示和原因,或者站内短信提示.... 虽然csdn现在很水...不过在那边之前待了几年还是有点感情的 想顺便内 ...
- 关于有默认值的字段在用EF做插入操作时的思考
今天在用EF做插入操作的时候发现数据库中一个datetime类型的字段(CreateDate)的值居然全部为null.于是赶紧看表结构发现CreateDate字段居然是允许为空的. 虽然为空,但是设置 ...
- mybatis generator配置生成代码的问题
接触第二种orm两天下来,一脸懵逼.mybatis是大多数公司所推崇的,相比于hibernate性能较为好的,操作更为方便的轻量级工具,所以小富就搞起这个orm.好吧,都说mybatis有个配置可以自 ...
- Oracle存储过程获取YYYY-MM-DD的时间格式
环境:Oracle 10g,11g 问题重现:PL/SQL中命令窗口下,发现存储过程得到的时间格式不符合预期要求. SQL> select sysdate from dual; SYSDATE ...
- selenium-webdriver(python) (十五) -- 鼠标事件
本节重点: ActionChains 类 context_click() 右击 double_click() 双击 drag_and_drop() 拖动 测试的产品中有一个操作是右键点击文件列 ...
- ShineTime - 带有 CSS3 闪亮特效的缩略图相册
ShineTime 是一个效果非常精致的缩略图相册,鼠标悬停到缩略图的时候有很炫的闪光效果,基于 CSS3 实现,另外缩略图也会有立体移动的效果.特别适用于个人摄影作品,公司产品展示等用途,快来来围观 ...
- 使用git提交中删除idea
https://segmentfault.com/q/1010000000720031 http://www.tuicool.com/articles/a6Nf63F 先有项目,然后分享至github ...