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

tootto 2008-11-26 04:59:39
加精
用一个开发实例再谈谈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已帮你定义好了。)

接着定义这个事件的方法:

public void OnSortingBegin()
{
if (SortingBegin != null)
{
SortingBegin(this, new EventArgs());
}
}


然后考虑什么时候调OnSortingBegin()这个方法以激发事件?自定义控件继承自dropdownlist,那么dropdownlist的PreRender事件是asp.net生命周期的最后一个事件,所以在这个事件激发的时候,dropdownlist所需做的都已经做完了,数据也已经绑定。所以就override这个事件。

protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e); //做这个dropdown应该做的事,先。
OnSortingBegin(); //排序前调用事件方法
SortItems(); //排序,忽略这个,先。
}


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


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

那么我首先定义这个事件返回数据类:public class SortingCompleteEventArgs : EventArgs (任何事件返回数据类都必须继承EventArgs类)
完整代码:

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


然后在自定义控件的类里加入如下代码,并做第一个事件代码的修改补充:

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

查找"Mike":
Customer c = customers.Find(delegate(Customer c3) { return c3.Name == "Mike"; });

查找所有Id >= 3:
List<Customer> customers2 = customers.FindAll(delegate(Customer c3) { return c3.Id >= 3; });

象不象.Net2.0 玩LINQ?


记住每一种技术细节的升级都是为了提高开发效率而诞生的,如果你不了解它,照猫画虎,为了时髦而用,技术升级对你来说就是负担。
...全文
3152 239 打赏 收藏 转发到动态 举报
写回复
用AI写文章
239 条回复
切换为时间正序
请发表友善的回复…
发表回复
lixiaoming325 2012-11-02
  • 打赏
  • 举报
回复
确实不错!!!
易酷天 2012-09-27
  • 打赏
  • 举报
回复
绑定 不错的分享
whh764224646 2012-08-29
  • 打赏
  • 举报
回复
学习学习!
否则做个源码附件,让初学都更好的的好学呢?
有的话给我一份谢谢!邮箱:191971159@qq.com
文盲老顾 2012-08-07
  • 打赏
  • 举报
回复
mark 后仔细看
sias_summer 2012-02-17
  • 打赏
  • 举报
回复
good thing
tks for you sharing
hanlu0012 2011-12-16
  • 打赏
  • 举报
回复
学习一下
Ysti 2011-12-09
  • 打赏
  • 举报
回复
学习啊
a09 2011-11-05
  • 打赏
  • 举报
回复
Mark
qingYun1029 2011-08-30
  • 打赏
  • 举报
回复
mark下!
woairuijuan9 2011-08-11
  • 打赏
  • 举报
回复
u





p
xinqinglhj 2011-07-27
  • 打赏
  • 举报
回复
不错

顶起来。

Mark一下。
wddpxqq 2011-07-21
  • 打赏
  • 举报
回复
学习啦
EP 2011-05-23
  • 打赏
  • 举报
回复
学习,顺道顶一下,嘿嘿
独立级IT民工 2011-04-20
  • 打赏
  • 举报
回复
顶啊,学习,收藏了
hzleexia 2011-04-08
  • 打赏
  • 举报
回复
帮顶再细看
yys863 2011-03-29
  • 打赏
  • 举报
回复
学习了 mark
duhao19871222 2011-02-23
  • 打赏
  • 举报
回复
不错的东东
IT_lujianlin 2011-01-09
  • 打赏
  • 举报
回复
大有所获..........
lone_lin 2011-01-08
  • 打赏
  • 举报
回复
看来关注的人也不少,呵呵……
cpfirst 2010-12-13
  • 打赏
  • 举报
回复
学习一下
加载更多回复(216)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧