当前位置: 代码迷 >> ASP.NET >> 附源代码+送分。通过编写自定义控件实例再论Delegate, Event Handling, anonymous method。解决方法
  详细解决方案

附源代码+送分。通过编写自定义控件实例再论Delegate, Event Handling, anonymous method。解决方法

热度:8298   发布时间:2013-02-26 00:00:00.0
附源代码+送分。通过编写自定义控件实例再论Delegate, Event Handling, anonymous method。
用一个开发实例再谈谈Delegate和Event Handling. 代码实现一个可排序的DropDownList自定义控件,分布讲解。

自定义控件的名称: SortableDropDownList, 继承DropDownList

不再过多解释什么是Delegate 和 Event Handling,要说的是,实战中,为什么要用它们,如何用它们提高开发效率,而不是为了用而用。

基于ASP.NET2.0的开发中,经常有二个场景使用Delegate:

1. Delegate + Event Handling
这个场景是经典Delegate使用场景,在这个场景中Delegate 和 Event Handling是联系在一起的。使用它的目的是将类更好的封装,定义这个类的事件,通过Delegate建立一个通道,当事件产生时可以传送给调用这个类的另外一个类。下面举例:

设计SortableDropDownList时,假设需要一个事件,这个事件是排序前激发,不返回任何EventArg.

首先定义事件: Public public event EventHandler SortingBegin; (这里没有定义delegate,因为EventHandler本身就是一个无返回事件数据的delegate,.Net已帮你定义好了。)

接着定义这个事件的方法:
C# code
public void OnSortingBegin(){   if (SortingBegin != null)   {       SortingBegin(this, new EventArgs());   }}


然后考虑什么时候调OnSortingBegin()这个方法以激发事件?自定义控件继承自dropdownlist,那么dropdownlist的PreRender事件是asp.net生命周期的最后一个事件,所以在这个事件激发的时候,dropdownlist所需做的都已经做完了,数据也已经绑定。所以就override这个事件。
C# code
 protected override void OnPreRender(EventArgs e)        {            base.OnPreRender(e); //做这个dropdown应该做的事,先。             OnSortingBegin(); //排序前调用事件方法            SortItems(); //排序,忽略这个,先。        }


现在,在某个使用这个控件的aspx页面,这个控件的属性里你就可以加上一个<..... SortingBegin = "OnSrotBegin"...>, 就像一个button,属性里你可以加 <...OnClick="...."> 一样。


然后假设需要定义另外一个事件,在排序完成时激发,返回排序前的itemList和排序后的itemList.

那么我首先定义这个事件返回数据类:public class SortingCompleteEventArgs : EventArgs (任何事件返回数据类都必须继承EventArgs类)
完整代码:
C# code
 public class SortingCompleteEventArgs : EventArgs    {        private ListItem[] originalItems;         private ListItem[] sortedItems;        public ListItem[] OriginalItems        {            set { originalItems = value; }            get { return originalItems; }        }        public ListItem[] SortedItems        {            set { sortedItems = value; }            get { return sortedItems; }        }        public SortingCompleteEventArgs(int length)        {            originalItems = new ListItem[length];            sortedItems = new ListItem[length];        }    }


然后在自定义控件的类里加入如下代码,并做第一个事件代码的修改补充:
C# code
public delegate void SortingCompleteHandler(object sender, SortingCompleteEventArgs arg);public event SortingCompleteHandler SortingComplete;public void OnSortingComplete(SortingCompleteEventArgs arg){    if (SortingComplete != null)    {        SortingComplete(this, arg);    }}protected override void OnPreRender(EventArgs e) {    base.OnPreRender(e);        SortingCompleteEventArgs arg = new SortingCompleteEventArgs(this.Items.Count);     Items.CopyTo(arg.OriginalItems, 0);         OnSortingBegin(); //调用事件1的方法。    SortItems(); //排序方法,忽略,先。    Items.CopyTo(arg.SortedItems, 0);    OnSortingComplete(arg); //调用事件2的方法。 }


下面来说使用Delegate的第二场景 -- Delegate + 匿名方法

匿名方法是.Net 2.0后特有,作用是一小段代码,经常用,却不值得为它定义一个方法,那么就用匿名方法,

举个例--排序。

一个实体类Customer, 属性有Id(int),Name(string). 现在有List<Customer> customers已经取值完成。

现在来玩delegate + 匿名方法, 

按照Name排序(升序): 
customers.Sort(delegate(customer c1, customer c2) { return c1.Name.CompareTo(c2.Name) ;} ); 

降序:
customers.Sort(delegate(customer c1, customer c2) { return c2.Name.CompareTo(c1.Name) ;} ); 

按照Id排序:
customers.Sort(delegate(customer c1, customer c2) { return c1.Id > c2.Id ;} ); 
  相关解决方案