发布时间:2021-09-15编辑:佚名阅读(2143)
简单示例:
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 : 0; } } 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 == 1) OnInput(this, new MyEventArgs(str[0])); //触发事件 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() + ")"); } } }
效果:
判断事件是哪个类触发的:
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[9];//声明 for (int i = 0; i < Evt.Length; i++) { Evt[i] = new MyEvent();//实例化 Evt[i].MyID = (i + 1).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; //解绑事件
在事件处理中设置参数,决定是否退出监听输入:
//事件参数定义 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#字符串添加分隔符
下一篇:c#通过控件名称获取控件
0人
0人
0人
0人