C#超简单自定义事件
我知道你为啥点进来,所以不要犹豫了,立刻马上果断创建控制台项目,直接复制下面精干短小而又强大的代码运行:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
if (Console.ReadLine() == "x")
OnInput(this, new EventArgs()); //触发事件
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件到方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
Console.WriteLine("你触发了‘X’!");
}
}
}
输入'x'回车,看效果:
如果触发事件的时候,想传递点参数怎么办?看来你是一个要求很高的人!请删掉上面的代码,复制下面的进去运行看看:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace TestEvent
{
//事件参数定义
class MyEventArgs : EventArgs
{
char _char;
string _msg;
//事件参数重载
public MyEventArgs(char chr)//当输入内容为字符
{
this._char = chr;
}
public MyEventArgs(string msg)//当输入内容为字符串
{
this._msg = msg;
}
//事件属性
public int Ascii//获取输入的(首字符)ASCII码
{
get { return string.IsNullOrEmpty(_msg) ? (int)_char : ; }
}
public char Char//获取输入的(首)字符
{
get { return string.IsNullOrEmpty(_msg) ? _char : '?'; }
}
public string Msg//获取输入的字符串
{
get { return string.IsNullOrEmpty(_msg) ? "Not String!" : _msg; }
}
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)
{
string str = Console.ReadLine();
if (str.Length == )
OnInput(this, new MyEventArgs(str[])); //触发事件
else
OnInput(this, new MyEventArgs(str)); //演示不同的参数类型
}
}
}
class Program
{
static void Main(string[] args)
{
MyEvent Evt = new MyEvent();//实例化
Evt.OnInput += On_Input; //绑定事件,也就是触发的方法
Evt.WaitInput();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
Console.WriteLine("输入的内容: " + e.Msg);
Console.WriteLine("输入的字符: " + e.Char + " (ASCII: " + e.Ascii.ToString() + ")");
}
}
}
效果:
然而还有一些道友有着更高更骚的要求,比如使用了很多的类[n],怎么处理事件,怎么判断事件是哪个类触发的?请看下面通过第一个示例修改后的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TestEvent
{
class MyEvent //声明事件
{
public event EventHandler<EventArgs> OnInput; //定义一个委托类型的事件
public string MyID { get; set; }
public void TestInput( string s)
{
if(s==MyID)//如果输入的和自己的ID一样,就触发事件
OnInput(this, new EventArgs());
}
}
class Program
{
static void Main(string[] args)
{ MyEvent[] Evt = new MyEvent[];//声明
for (int i = ; i < Evt.Length; i++)
{
Evt[i] = new MyEvent();//实例化
Evt[i].MyID = (i + ).ToString();//设置ID1~9
Evt[i].OnInput += On_Input; //都绑定事件到同一个方法
}
while (true)//由于是单线程不能每个都循环,输入监视放到这里来,写成多线程代码增多太绕了
{
string s = Console.ReadLine();
foreach (MyEvent me in Evt)
me.TestInput(s);//分别提交测试
}
}
//事件处理方法
private static void On_Input(object sender, EventArgs e)
{
string _id = (sender as MyEvent).MyID;//注意这里
Console.WriteLine("第 " + _id + " 被触发!");
}
}
}
输入数字后回车看效果:
最后还剩一个特别说明,专门为好奇心特别重的朋友准备,上面的代码中,绑定事件为啥写成+=?因为...
Evt.OnInput += On_Input; //绑定事件
Evt.OnInput -= On_Input; //解绑事件
6-18:再补充一个简单的例子,在事件处理中设置参数,决定是否退出监听输入:
//事件参数定义
class MyEventArgs : EventArgs
{
public MyEventArgs(string s) { InputString = s; }
public string InputString { get; private set; }
public bool Cancel { get; set; }
}
//事件
class MyEvent
{
public event EventHandler<MyEventArgs> OnInput; //定义一个委托类型的事件
public void WaitInput()
{
while (true)//监视输入的循环
{
string str = Console.ReadLine();
if (!string.IsNullOrEmpty(str))
{
MyEventArgs myevent = new MyEventArgs(str);
OnInput(this, myevent); //触发事件
if (myevent.Cancel)
{
Console.WriteLine("退出监听!");
break;
}
}
}
}
}
class Program
{
static void Main(string[] args)
{ MyEvent Evt = new MyEvent(); //实例化
Evt.OnInput += On_Input; //绑定事件
Evt.WaitInput(); //监听输入
Evt.OnInput -= On_Input; //解绑事件
Console.ReadLine();
}
//事件处理方法
private static void On_Input(object sender, MyEventArgs e)
{
if (e.InputString == "x")
e.Cancel = true; //设置取消监听
else
Console.WriteLine("您输入了:" + e.InputString);
}
}
效果:
上面的示例修改自网上,机制、原理啥的我也不复制了,太绕了,反正发一大堆文字也没啥人愿意看,还不如简单粗暴直接代码算了。大家都是这么用,无毒无副作用无不良反应。
C#超简单自定义事件的更多相关文章
- .net 中 C# 简单自定义事件实现
个人认为事件处理机制是一种很好的机制 特别是可以方便安全的实现窗口间(子窗口对父窗口,子窗口间等)的消息传递.功能调用 下面展现的源自以前论坛上看到的一套方法,可能记得不大准确,所以可能不规范,我的理 ...
- js简单自定义事件与主动触发事件
var events = { addHandler: function (element, eventType, handler) { if (element.addEventListener) { ...
- JavaScript使用自定义事件实现简单的模块化开发
WEB前端最常见驱动方式就是事件了, 所有交互等等都是通过事件,前端的常见事件有: UI事件: 焦点事件: 鼠标事件: 滚轮事件: 文本事件: 键盘事件: 变动事件: 现在网页上有一个输入框, 如果我 ...
- .net自定义事件,经典简单实例代码
1,新建一个控制台应用程序TestDelegate,本项目主要实现:热水器加热,报警器监控,当热水温度达到80度的时候报警器报警这样一个简单的事件处理程序 2,定义委托处理程序 public dele ...
- Abp 领域事件简单实践 <三> 自定义事件
熵片用到的 EntityCreatedEventData<TEntity>,继承自EventData. 我们可以自定义事件: public class TestEvent: EventD ...
- Javascript之自定义事件
Javascript自定义事件,其本质就是观察者模式(又称订阅/发布模式),它的好处就是将绑定事件和触发事件相互隔离开,并且可以动态的添加.删除事件. 下面通过实例,一步一步构建一个具体的Javasc ...
- 跟着《beginning jquery》学写slider插件并借助自定义事件改进它
<beginning jquery>是一本很不错的学习jquery的书,作者的讲解深入浅出,很适合初学者,在最后一章里面,作者把前面所有的点结合起来完成了一个轮播图的jquery插件.实现 ...
- 把C#程序(含多个Dll)合并成一个Exe的超简单方法
开发程序的时候经常会引用一些第三方的DLL,然后编译生成的exe文件就不能脱离这些DLL独立运行了. 但是,很多时候我们本想开发一款只需要一个exe就能完美运行的小工具.那该怎么办呢? 下文介绍一种超 ...
- 【2016-11-11】【坚持学习】【Day24】【WPF 自定义控件 附加属性 自定义事件】
UserControl ,自定义控件. 这里刚刚想到一个问题.什么时候应该用usercontrol 定义一个控件.什么时候应该重写控件的template和样式,实现新效果. 引用一下人家的话:http ...
随机推荐
- Python【pyyaml】模块
pyyaml模块安装: pip install pyyaml pyyaml导入: import yaml pyyaml使用: 1.使用前,在pycharm中新建一个以yaml或yml结尾的文件,保存为 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G Trace(思维+set)
https://nanti.jisuanke.com/t/31459 题意 n个矩阵,不存在包含,矩阵左下角都在(0,0),给右上角坐标,后来的矩阵会覆盖前面的矩阵,求矩阵周长. 分析 set按照x或 ...
- pymysql常见问题
1.Python中pymysql出现乱码的解决方法 一般来说,在使用mysql最麻烦的问题在于乱码. 查看mysql的编码: show variables like 'character_set_%' ...
- [Android] 免费天气预报接口
[Android] 免费天气预报接口 这是 国家气象局提供的天气预报接口 [免费] 当然,网上有很多的收费API或者每天定次数的接口 使用 国家气象局 的步骤如下: 1.首先获取城市ID号 北京:10 ...
- [物理学与PDEs]第4章第2节 反应流体力学方程组 2.2 反应流体力学方程组形式的化约
1. 粘性热传导反应流体力学方程组 $$\beex \bea \cfrac{\rd \rho}{\rd t}&+\rho \Div{\bf u}=0,\\ \cfrac{\rd Z}{\rd ...
- error while loading shared libraries: libg2o_core.so: cannot open shared object file: No such file or directory解决方法
在build文件夹目录环境下输入: sudo ldconfig 然后编译就可以了.因为g2o刚装,没生效.
- mongoose 连接数据库操作
连接数据库 var mongoose = require('mongoose'); var schema = mongoose.Schema; // 连接MongoDB mongoose.connec ...
- Linux 一 些常用的命令
查看当前系统JAVA的安装路径: echo $JAVA_HOME: 查看内核版本: uname -a ubuntu的防火墙 关闭:ufw disable开启:ufw enable 卸载了 iptabl ...
- JVM--01
---恢复内容开始--- jdk jre jvm 的关系 java7的结构图 java8 jvm内存溢出 jdk /bin 目录下的jconsole java发展历史 oak:用在嵌入式设备上 相 ...
- 【原创】大叔问题定位分享(29)datanode启动报错:50020端口被占用
集群中有一台datanode一直启动报错如下: java.net.BindException: Problem binding to [$server1:50020] java.net.BindExc ...