C#winform最简单的方法就是拖控件,然后双击控件生成默认的事件。再此双击生成的只是事件的方法,事件的订阅在form.desigener.cs中,如 this.DBSelectBTN.Click += new System.EventHandler(this.DBSelectBTN_Click);。C#winform编程采用预处理机制,所谓预处理机制就是事件的发布订阅都已经处理完成,只需要使用者定义事件对应的方法即可。以button的click为例,事件发布早已经提前处理完成,即EventHandler,事件的订阅在使用者双击控件时完成(所以在通过类定义控件而不是拖动控件时,需要自己对click事件进行订阅)。而事件的触发条件就是用户对空间进行点击时,这个触发条件由C#进行监听,当点击时触发。以button为例,双击生成的方法由两个参数,如private void TestBtn_Click(object sender, EventArgs e)中的object和eventargs,其中eventargs为事件数据类,其他事件数据类继承自此类如KeyEventArgs,是C#预定义的获取键盘事务的类,即C#通过此类获取key值。
通过以下例子来模拟C#预处理事件,此例子中请忽略类的名字。
class Program { ////// 模拟C#button click事件或者textbox 的keypress事件来更好的理解相关功能 /// C#对事件进行了预处理,在Button类的父类中定义了click事件 /// 在winform上添加事件时,其实添加的是一个方法,在form.cs中对此事件进行了订阅 /// C#对事件的发布以及触发事件的方法以及事件的订阅进行了预处理,使用者只需要完善订阅事件的方法 /// 两个参数 object sender,EventArgs e也已经进行了预处理 /// sender参数的理解:以button.click事件为例,触发事件时参数可以为click(this(或者Btn),new EventArgs()),其中Btn为Button类的一个实例 /// e参数的理解:以KeyEventArgs为例,此类继承自EventArgs类,C#通过此类获取相关输入设备的输入值; /// /// static void Main(string[] args) { //模拟C#内部获取相应输入数据 string str = Console.ReadLine(); char a = str[0]; KeyEventArgs e = new KeyEventArgs(a); TextBox tbx = new TextBox(); textBox1 tbx1 = new textBox1(tbx); tbx.Run(e); Console.WriteLine(tbx.Text); Console.ReadKey(); } } ////// 模拟C#预处理的KeyEventArgs类 /// 此类也可以不用继承EventArgs,只是用来模拟C#,C#中事件数据类都继承自此数据基类 /// class KeyEventArgs:EventArgs { private char keyChar; public KeyEventArgs(char keyChar) //来模拟C#获取键盘数据 { this.keyChar = keyChar; } public char KeyChar { get { return keyChar; } } } ////// 模拟C#预处理的TextBox类 /// class TextBox { public delegate void KeyEventHandler(object sender, KeyEventArgs e); public event KeyEventHandler keypress;//发布事件 //模拟textbox的text属性 public string Text { get;set; } //定义触发事件的方法,模拟C#内部触发事件的方法 public void Run(KeyEventArgs e) { if(keypress!=null) { keypress(this, e);//此处this为TextBox } } } ////// 此部分为订阅事件以及订阅事件的方法,此类中的方法为用户自己操作的部分 /// class textBox1 { //订阅事件 public textBox1(TextBox tbx) { tbx.keypress += new TextBox.KeyEventHandler(Show); } //订阅事件的方法 public void Show(object sender, KeyEventArgs e) { TextBox tb = (TextBox)sender; tb.Text = e.KeyChar.ToString(); } }
下面例子我们来模拟button类。
////// 模拟button类 /// class myButton { //只模拟click事件 public delegate void clickEventHandler(object sender, EventArgs e); public event clickEventHandler click;//发布click事件 //click 触发的条件 //通过此布尔值来模拟C#对鼠标单击时的事件监听,当为true时表示单击完成 public void Onclick(bool clicked) { EventArgs e = null; if (clicked) { //if(click!=null) //{ // click(this, e); //} click?.Invoke(this, e); } } } class Program { static void Main(string[] args) { myButton button1 = new myButton(); button1.click += new myButton.clickEventHandler(button1_click);//委托为静态的,必须用类名引用 EventArgs e=null; bool clicked = true;//表示进行单击 button1.Onclick(clicked); Console.ReadKey(); } //----------------------------------------------------// //此方法的名字纯粹是为了模拟双击控件时默认的方法名字 static void button1_click(object sender,EventArgs e) { Console.WriteLine("这是单击时触发的方法"); } }
虚线一上部分即为C#为我们处理好 的部分,我们只需要拖动控件,生成button_click方法。
这是C#的预处理事件机制。简单模拟一下。