C#自定义事件(简单版本)
C#中的事件分为两种:一种是厂商微软在VS中已经内置,以供用户使用;另一种是有用户自己定义的事件;
先简单回顾下第一种:
【场景1】一个Form上一个Textbox控件和Button控件,当用户按下Button控件时,textbox显示内容“按钮被按下”,当用户松开按钮时,textbox则显示“按钮松开”;
代码如下:
using System.Windows.Forms; namespace ButtonEventBokeyuan
{
class Program
{
static void Main(string[] args)
{
MyForm1 myForm1 = new MyForm1();
myForm1.FormInitShow();
}
}
public class MyForm1
{
Form form1 = new Form();//定义类的字段-控件1
Button button = new Button();//定义类的字段-控件2
TextBox textBox = new TextBox();//定义类的字段-控件3
public void FormInitShow()
{
button.Text = "Press me";
button.Top = 30;
form1.Controls.Add(button);
form1.Controls.Add(textBox);
button.MouseDown += button_MouseDown;//VS中button自带的事件挂接事件处理器
button.MouseUp += button_MouseUp;//VS中button自带的事件挂接事件处理器
form1.ShowDialog();
}
private void button_MouseUp(object sender, MouseEventArgs e)
{
this.textBox.Text = "按钮被松开";
}
private void button_MouseDown(object sender, MouseEventArgs e)
{
this.textBox.Text = "按钮被按下";
}
}
}
运行效果:

以上回顾了VS自带的事件;
接下来,看看第二种,咱们自己如何定义一个类的事件内,以便让其他人去订阅,即事件的挂接;
【场景2】:现在有3种人,指挥官、士兵、平民,他们全部派生自人这个基类;人这个类都具有Run()这个可重写的方法;
现在指挥官有个事件——咳嗽(暗号),而士兵订阅了这个咳嗽事件,一旦指挥官走出来,然后咳嗽,士兵就会立即发起进攻;同时士兵也有进攻开始这个事件,该事件被平民订阅,一旦士兵发起进攻,平民就会跑;
先看类图:

接下来实现完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks; namespace CustomerEvent
{
public delegate void UserRequest();
class Program
{
static void Main(string[] args)
{
Commander commander = new Commander("Jack");
Soldier soldier = new Soldier("Herry");
Civilian civilian = new Civilian("Allen");
commander.KekeEvent += soldier.OnKekeHandler;//指挥官的咳嗽暗号事件订阅
soldier.AttackBegin += civilian.OnAttackingHandler;//士兵的开始攻击事件订阅
commander.Trigger();//指挥动作引起一些列士兵和平民的事件;
Console.ReadLine();
}
}
/// <summary>
/// 基类
/// </summary>
public class Person
{
private string name;
public Person(string name)
{
this.name = name;
}
public string Name { get; set; }
public virtual void OnAttackingHandler()
{
Console.WriteLine($"{GetTime.GetTimeNow()}{this.Name}开始跑了。。。");
}
}
/// <summary>
/// 指挥官类,具有咳嗽的事件,暗号
/// </summary>
class Commander : Person
{
public Commander(string name) : base(name)
{
this.Name = name;
}
public event UserRequest KekeEvent;
public void Trigger()
{
this.OnAttackingHandler();
Console.WriteLine($"{GetTime.GetTimeNow()}指挥官{this.Name}咳嗽暗号");//指挥官跑出来发出咳嗽暗号
if (KekeEvent!=null)//事件不为空,则执行
{
KekeEvent();
}
else
{
Console.WriteLine($"{GetTime.GetTimeNow()}commander没触发事件");
}
}
public override void OnAttackingHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}指挥官{this.Name}跑出来");
}
}
/// <summary>
/// 士兵类;
/// </summary>
class Soldier : Person
{
public event UserRequest AttackBegin;
public Soldier(string str) : base(str)
{
this.Name = str;
}
internal void OnKekeHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}士兵{this.Name}开始攻击...");
if (AttackBegin != null)
{
AttackBegin();
}
else { }
}
public override void OnAttackingHandler()
{
Thread.Sleep(20);
Console.WriteLine($"{GetTime.GetTimeNow()}士兵{this.Name}开始跑了...");
}
}
/// <summary>
/// 平民类
/// </summary>
class Civilian : Person
{
public Civilian(string name) : base(name)
{
this.Name = name;
}
public override void OnAttackingHandler()
{
Thread.Sleep(100);
Console.WriteLine($"{GetTime.GetTimeNow()}平民{this.Name}逃难跑了。。。");
}
}
class GetTime
{
public static string GetTimeNow()
{
return DateTime.Now.ToString("hh:mm:ss.fff")+">>";
}
} }
实现效果:

End.
写在最后,文章中的第二个场景是本人原创Demo,用来更好地理解用户事件的编程技术;重在自己多练习,不然觉得自己懂了,一旦动手,仍然两眼一抹黑!
#未经本人允许,禁止各种形式转载与转发#
谢谢!
C#自定义事件(简单版本)的更多相关文章
- JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
- 仿EXCEL插件,智表ZCELL产品V1.6 版本发布,增加自定义事件功能
详细请移步 智表(ZCELL)官网www.zcell.net 更新说明 这次更新主要应用户要求,主要解决了单元格值变化时事件的支持,并新增了按单元格名操作的相关API,欢迎大家体验使用. 本次版本更 ...
- .net 中 C# 简单自定义事件实现
个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...
- Abp 领域事件简单实践 <三> 自定义事件
熵片用到的 EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...
- javascript和jquey的自定义事件小结
“通过事件机制,可以将类设计为独立的模块,通过事件对外通信,提高了程序的开发效率.” 可以把多个关联但逻辑复杂的操作利用自定义事件的机制灵活地控制好 对象之间通过直接方法调用来交互 1)对象A直接调用 ...
- JavaScript自定义事件
很多DOM对象都有原生的事件支持,向div就有click.mouseover等事件,事件机制可以为类的设计带来很大的灵活性,相信.net程序员深有体会.随着web技术发展,使用JavaScript自定 ...
- JS自定义事件(Dom3级事件下)
原文出处: http://www.w3cfuns.com/notes/11861/e21736a0b15bceca0dc7f76d77c2fb5a.html . 我拿出作者中的一段,感谢作者原创. ...
- js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
- 转: JS自定义事件的定义和触发(createEvent, dispatchEvent)
四.伪DOM自定义事件 这里的“伪DOM自定义事件”是自己定义的一个名词,用来区分DOM自定义事件的.例如jQuery库,其是基于包装器(一个包含DOM元素的中间层)扩展事件的,既与DOM相关,又不直 ...
- 漫谈js自定义事件、DOM/伪DOM自定义事件
一.说明.引言 我JS还是比较薄弱的,本文的内容属于边学边想边折腾的碎碎念,可能没什么条理,可能有表述不准确的地方,可能内容比较拗口生僻.如果您时间紧迫,或者JS造诣已深,至此您就可以点击右侧广告(木 ...
随机推荐
- JAVA pta 前三次大作业回顾与分析
一.前言:总结三次题目集的知识点.题量.难度等情况 今年初次接触java,通过这三次大作业的练习,我对java有了一定的认识,相比于其他编程语言来说,java更复杂,要求也更严谨,需要掌握的知识也更多 ...
- Codeforces Round #843 (Div. 2) Problem C
C. Interesting Sequence time limit per test 1 second memory limit per test 256 megabytes input stand ...
- IDEA 2018.3.*本地启动tomcat项目无法设置Application context localhost 404
记录一个开发中遇到的坑,网上找了好久才找到一个能解决的办法,特此转载一下. 旧版的idea启动web项目,在tomcat配置环节,有设置Application content的功能.我们可以设置成&q ...
- 连接打印机Lodop
<div class="panel-body"> <div class="row show-grid"> <div class=& ...
- C语言初级阶段7——指针4
C语言初级阶段7--指针4 结构体指针 1.概念:所谓的结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针.如果把一个结构体变量的其实地址存放在一个指针变量中,那么这 ...
- java学习笔记(五)运算符
++ -- 自增自减 a++ 执行完这行代码后,先给b赋值,再自增 ++a 执行完这行代码前,先自增,再给b赋值 Math类
- python学习记录(三)-数据类型
字符串格式化 var = 'abcde' # 切片 print(var[2],var[-1]) # c e print(var[1:3:1],var[-2:-5:-1],var[::-1]) # bc ...
- .net创建、发布、引用webservice项目
创建webservice引用 增加代码: 运行如下: 之后就可以发布我们的项目了,右击项目,选择发布: 此地址不要选择项目地址,另外创建一个地址: 至此,发布成功,接下来iis增加web网站: 这里i ...
- 腾讯云等Linux环境下Redis安装配置
1.下载redis解压安装命令教程 https://www.cnblogs.com/hunanzp/p/12304622.html 2.配置远程连接 修改bind 127.0.0.0 为 bind ...
- Java学习笔记-BigDecimal类型
1.介绍 Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更 ...