引子
如何手动绑定服务对象的事件处理(一)
无知的猜试:
//事件处理方法(单页情况)
//两个对象的事件处理:WebForm加载事件和LinkButton的单击事件
//对象声明
//运行结果:事件委托似乎没有与事件处理“挂勾”
Error 1 No overload for 'ReturnPrePage' matches delegate 'System.EventHandler'
D:/lidodo.net/Lidodo.Web/Lidodo.Web.Website/home/Message.aspx 58
Error 2 No overload for 'Page_Load' matches delegate 'System.EventHandler'
D:/lidodo.net/Lidodo.Web/Lidodo.Web.Website/home/Message.aspx 24
分析原因:
我说事件委托没有与事件处理“挂勾”是很对的,挂接代码的确没有。但直接用IDE编写控件的事件也是没有显示的挂接,这就给初学都一种错误的导向,以为事件处理就是那么一回事,事实却是IDE神鬼不觉的做了手脚。
问题出在哪儿?
问题出在对象的生命期我们把握不定。我们不知道在什么地方可以看见对象,然后对其进行事件处理的挂接。
抽象
事件触发对象sender和事件参数EventArgs 从何而来的?
事件是委托使用的一特殊例子,再加上ASP.NET的声明式编程,这两个搞得你头晕脑转了。好好再研究一下。
委托的前身是函数指针,也是就动态调用。
事件是一个比较特别的概念。
声明式绑定:
编程式绑定:
gridview的排序事件处理方法(虚的)
gridview的排序事件(有手柄类型?)
排序事件手柄GridViewSortEventHandler(一个委托,有一个事件参数类型
事件参数类型GridViewSortEventArgs (参数有排序方向和排序表达式,类继承自CancelEventArgs)
CancelEventArgs
EventArgs
回调说白了就是一般客户对象调用服务对象反向,即服务对象(使用某种机制,如事件)反过来通知或调用客户执 行任务。
这个还好理解,加了个委托(特殊委托—事件)搞到你“神魂颠倒”。在这个服务控件被触发的情景中,我们看到,事件是GridView的事件,执行任务是页面类执行任务。如:
这个方法正名应该只是页面类的成员方法,只不过它用来处理事件服务对象GridView排序事件罢了,不信?看看挂代码:
我们看看这个Sorting事件的定义:
public event GridViewSortEventHandler Sorting;
哦,类型event 和名字Sorting之 间有一个处理手柄,它是什么?它就是委托。就是定义处理本事件的手柄的原型。看看它的定义:
public delegate void GridViewSortEventHandler(object sender, GridViewSortEventArgs e);
看到了,这就是委托,看看它的方法参数与事件处理方法this_Sorting(object sender, GridViewSortEventArgs e)是一样的,这样就可以“委托”了。