winform事件

 

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

 

你可能感兴趣的:(【C#】)