博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
winform事件
阅读量:4955 次
发布时间:2019-06-12

本文共 3986 字,大约阅读时间需要 13 分钟。

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#的预处理事件机制。简单模拟一下。

 

转载于:https://www.cnblogs.com/llstart-new0201/p/6775882.html

你可能感兴趣的文章
最后一次作业-----课程总结
查看>>
用java代码写的简易计算器(可以实现基本的加减乘除功能)
查看>>
18.04ubuntu安装mysql,同时设置root密码
查看>>
ubutun18.04 安装redis
查看>>
远程ubuntu18.04 安装java1.8
查看>>
ubutun 18.04 安装maven
查看>>
ubutun18.04安装 rocketmq
查看>>
git clone
查看>>
处理版本冲突
查看>>
jackson 实体转json 为NULL或者为空不参加序列化
查看>>
bloom过滤器
查看>>
数组内存的释放与申请
查看>>
小白系统篇-windows 系统安装
查看>>
通过Ldap实现人事系统组织人事和AD的同步
查看>>
KVM虚拟机嵌套虚拟化
查看>>
常用多线程方法
查看>>
Spring AOP技术本质认识
查看>>
Docker Compose YML文件配置
查看>>
常用分布式事务解决方案
查看>>
线程三态和JVM线程状态
查看>>