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造诣已深,至此您就可以点击右侧广告(木 ...
随机推荐
- 【python_PAT_乙类】1013_数素数 ,Python运行超时解决方案
题目: 令 Pi 表示第 i 个素数.现任给两个正整数 M≤N≤104,请输出 PM 到 PN 的所有素数. 输入格式: 输入在一行中给出 M 和 N,其间以空格分隔. 输出格 ...
- 本地mysql端口3306 一直干不掉这样解决
第一步:先whereis mysql(查找到MySQL的一些本地文件) 主要删除这两个 再干掉端口3306 即可
- iview的表格 render
view的表格 render 先看一下效果图 效果题 代码如下 render render:(h,params)=>{} //h指dom对象,params指当前每一行数据(param ...
- HttpRunner4.x版本调试测试用例时报错 run testcase failed error="abort running due to failfast setting: variable XXX not found" 解决方法
httprunner脚本调试报错 未知变量名称未定义问题 解决了,由于请求的requestBody证件照片链接包含$关键字,需要使用$$转义. 执行脚本报错截图 接口requestBody参数截图 ...
- 版本不兼容(NoSuchMethodError: com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank)
"C:\Program Files\Java\jdk1.8.0_221\bin\java.exe" -XX:TieredStopAtLevel=1 -noverify -Dspri ...
- circos plot in R
FIN=read.table(IN,header=TRUE) circos.clear() circos.par("start.degree" = 90) circos.initi ...
- springboot中redis使用和工具
application.properties #Redis相关配置 spring.data.redis.host=localhost #端口 spring.data.redis.port=6379 # ...
- 获取指定网卡的ip
#!/usr/bin/env python # -*- coding: utf-8 -*- import socket import fcntl import struct def get_ip_ad ...
- setTimeout的那些事
一.我们可以设置一个定时器用以指定某个程序在指定时间后才执行 1 setTimeout(function(){ 2 console.log("do something"); 3 ...
- layui使用OSS上传
1.首先要把aliyun-oss-sdk.js包下载下来,放到指定的目录下面 在要用的页面引入或者在index.html入口文件全局引入: <script src="util/ali ...