zoukankan      html  css  js  c++  java
  • 认识委托和事件

    最近在自定义控件中做了个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; }
            }
        }

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

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

  • 相关阅读:
    ZOJ 2588 Burning Bridges
    POJ 1966 ZOJ 2182 Cable TV Network
    HDU 5348 MZL's endless loop
    HDU 5352 MZL's City
    Tarjan算法求解无向连通图的割点、割边、点双连通分量和边双连通分量的模板
    ZOJ 1119 SPF
    HDU 3452 Bonsai
    HDU 1520 Anniversary party
    POJ 2239 Selecting Courses
    POJ 1144 Network
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/2939146.html
Copyright © 2011-2022 走看看