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; }
            }
        }

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

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

  • 相关阅读:
    file is universal (3 slices) but does not contain a(n) armv7s slice error for static libraries on iOS
    WebImageButton does not change images after being enabled in Javascript
    ajax OPTION
    编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    获取海洋天气预报
    C#线程系列教程(1):BeginInvoke和EndInvoke方法
    js控制只能输入数字和小数点
    Response.AddHeader(,)
    ManualResetEvent的理解
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 区别
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/2939146.html
Copyright © 2011-2022 走看看