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造诣已深,至此您就可以点击右侧广告(木 ...
随机推荐
- 理解Node.js中的流(译)
前言 本文部分译自by: Liz Parody in Node.js, 2019.11.23,英文良好的同学建议阅读原版. Node.js中的流是众所周知的难理解,而且更加难用.按照Dominic T ...
- MySql 错误:建表时出错1067 - Invalid default value for 'id'
问题描述: 建表时报错无效的默认值: CREATE TABLE `product`( `id` INT(10) NOT NULL PRIMARY KEY AUTO_INCREMENT COMMENT ...
- k8s利用endpoints和service访问外部服务
一.原理解析 在k8s集群中我们通过创建service去访问对应pod内的服务,而在创建service的时候会同时创建一个与service同名的endpoints对象,endpoints与pod实际建 ...
- 学习使用数据库SQLServer (一)
小记一下学习使用数据库时遇到的问题 1.建表时未设置主键约束名,此时删表主键会遇到困难,不能简单使用 ALTER TABLE NAME DROP CONSTRAINT 约束名: 而是要先找到数据表中主 ...
- Linux系列---【内存占用过高问题排查思路】
内存占用过高问题排查思路 1.使用top命令查看后台任务 按shift+M使应用按内存使用率排序,定位到第一个使用内存最高的应用,并找到对应的PID. 2.使用ps命令查看对应的pid对应哪个应用 p ...
- 浙里办微信小程序总结
浙里办微信小程序单点登录流程 1.获取浙里办跳转地址中ticket或者微信小程序中的ticketId let ticket = getQueryString("ticket", w ...
- linux软件安装篇
nginx篇 第一件事情 cd /etc/yum.repo.d mv CentOS-Base.repo CentOS-Base.repo.bak wget -O CentOS-Base.repo ht ...
- break跳出循环
- pwd学习
pwd学习 学习pwd命令 首先通过man命令去学习pwd man pwd pwd pwd --help getcwd():getcwd(char *buf,size_t size) readdir( ...
- mybatis-plus自动填充踩坑
学习使用mybatis-plus的自动填充功能,对create_time和update_time做一个自动填充,期间碰到了一些问题,记录一下问题和相关代码 在实体类字段上增加注解@TableField ...