认识委托和事件
最近在自定义控件中做了个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; } } }
终于,我在自定义控件中自定义的事件做好了。
然后剩下在应用控件的页面用委托注册出事件,在事件中做出业务逻辑需要的判断,自定义控件的自定义事件就这么做好了。