认识委托和事件

最近在自定义控件中做了个DropDownList的联动事件,具体的要求就是选择起始日期的年、月份和截止日期年、月份保持一样,避免起始日期大于截止日期。

--------------------------------分割线----------------------------------------

首先就要明白以下几个知识点:

委托

事件

AutoPostBack

AutoPostBack是通过让控件提交表单后让服务器回传控件信息的属性,将它设置为true的时候,显而易见的,在网页上点击该控件后,网页会有一个刷新的动作。如果把这个动作过程回传的控件信息用作联动,再好不过。所以我需要给自定义控件的两个子DropDownList控件设置该属性。

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。

那么委托是个什么样子呢?

namespace ConsoleApplication1
{
    class Class1
    {
        delegate void myde(int a, int b);
        static void Main(string[] args)
        {
            Class1 cd = new Class1();
            myde mydel=cd.add;
            mydel(cd.getInt1(1),cd.getInt2(2));
        }
        public int getInt1(int a)
        {
            return a;
        }
        public int getInt2(int b)
        {
            return b;
        }
        public void add(int a, int b)
        {
            Console.WriteLine(a-b);
            Console.ReadKey();
        }
    }
    
}

输出 -1;跟add方法的操作一样。

当它和事件组合的时候又有另一种不同的用法:

先看个概述:

namespace ConsoleApplication1
{
    class Class1
    {   
public delegate void myEventDe(object sender, EventArgs e); public event myEventDe myEvent; static void Main(string[] args) { Class1 cd = new Class1(); cd.myEvent += new myEventDe(myUse); EventArgs e=new EventArgs(); cd.myEvent(cd,e); } static void myUse(object sender, EventArgs e) { Console.WriteLine("触发了事件"); Console.ReadKey(); } } }

 这就是事件的概况。

       

public delegate void OnSelectChangedHandle(object sender,DateEventArgs e);
public event OnSelectChangedHandle DateSelectChanged;

而事件中的两个参数:sender和e不是一成不变的,他们可以随意定义。同时可以将两个事件的不同结果同时加到一个事件中去。所以我给自定义的DateEvenArgs类设为两个参数,分别记录年和月。

        protected void Years_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DateSelectChanged != null)
                DateSelectChanged(this, new DateEventArgs(this.Years.SelectedValue,this.Months));
           
        }

        protected void Month_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DateSelectChanged != null)
                DateSelectChanged(this, new DateEventArgs(this.Years.SelectedValue, this.Months));
        }

        public void ChangeDate(string year, string month)
        {
            Month.SelectedValue = month;
            Years.SelectedValue = year;
        }

由于我重新定义了一个事件类叫做 DateEvenArgs,所以我还必须新建一个类:

public class DateEventArgs : EventArgs
    {
        private string dateYear;
        private string dateMonth;
        public string selectDateValue;
        public DateEventArgs(string i,string j)
        {
            this.dateYear = i;
            this.dateMonth = j;
            this.selectDateValue = i + j;
        }
        public string SelectDateValue
        {
            get { return selectDateValue; }
        }
    }

终于,我在自定义控件中自定义的事件做好了。

然后剩下在应用控件的页面用委托注册出事件,在事件中做出业务逻辑需要的判断,自定义控件的自定义事件就这么做好了。

原文地址:https://www.cnblogs.com/JhoneLee/p/2939146.html