• 认识委托和事件


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

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

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

  • 相关阅读:
    pl/sql developer中如何导出oracle数据库结构? 参考文章一
    ORACLE知识点整理之一
    WebService之第一天
    Eclipse中,open declaration;open implementation;open super implementation的区别
    Maven 手动添加 JAR 包到本地仓库
    clipse maven 项目 出现红色叹号 解决方法
    eclipse快捷键设置
    Hibernate3--快速入门--第一天
    C++ 虚函数表解析
    c++ primer复习(二)
  • 原文地址:https://www.cnblogs.com/JhoneLee/p/2939146.html
Copyright © 2020-2023  润新知