这三个地方的调用都是在处理PostBackData阶段,因此我们可以认为这个注册机制最好在处理PostBackData阶段使用是比较符合规范的。 对于HtmlInputImage和ImageButton这两个Control,它们都有PostBackData,而且通过注册的方法实现了IPostBackDataHandler接口,所以在LoadPostData阶段调用Page.RegisterRequiresRaiseEvent,这样就显式的告诉Page在PostBackEvent处理阶段调用自己的IPostBackEventHandler接口,就实现了服务端Click事件的触发。
那么Page.ProcessPostData函数(在我的上一篇文章
Web Control 开发系列(二) 深入解析Page的PostBack过程和IPostBackDataHandler有介绍),它会收集所有的表单提交数据,如果有和这个数据对应的Control(通过Page.FindControl查找),那么就设法调用其IPostDataHandler,如果IPostDataHandler为null,那么设法取其IPostEventHandler,如果不为null,那么就调用Page.RegisterRequiresRaiseEvent函数来注册它。Button只实现了IPostBackEventHandler接口,没有实现IPostBackDataHandler接口,所以就通过这种发式来触发事件的。
一旦在Page上进行了Page.RegisterRequiresRaiseEvent注册,系统就不会关心postData["__EVENTTARGET"]和postData["__EVENTARGUMENT"]了,直接就调用注册的IPostBackEventHandler.RaisePostBackEvent方法。
上面介绍的内容都是对Page.RaisePostBackEvent的分析:
privatevoid RaisePostBackEvent(NameValueCollection postData) { // 1. 假如已经在Page上显式的注册了引起PostBackEvent的Control,就直接处理if (this._registeredControlThatRequireRaiseEvent !=null) { this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null); }else{ // 这部分代码,我自己按照Reflector反编译的结果重新组织了,但是逻辑 // 没有任何变化,只是方便阅读理解 // 2. 假如没有注册,就查找__EVENTTARGET记录的Control来处理string str = postData["__EVENTTARGET"]; bool flag =!string.IsNullOrEmpty(str); Control control =null; if (flag) { control =this.FindControl(str); if ((control !=null) && (control.PostBackEventHandler !=null)) { string eventArgument = postData["__EVENTARGUMENT"]; this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument); } }elseif (this.AutoPostBackControl ==null) { // 这个AutoPostBackControl的标记设置为了不重复做Validate,后面我在讲述 // Validation机制的时候会介绍this.Validate(); } } }
四、Composite Control 的冒泡事件 在Control上面有一个方法RaiseBubbleEvent,这个方法就是沿着Control Tree向上一次调用OnBubbleEvent函数,知道返回true,就推出,是一个典型的冒泡事件。Control对于OnBubbleEvent的实现是简单的返回false,也就是说如果我们不做处理,那么事件会不停的向上冒泡知道最顶端的Page。
protectedvoid RaiseBubbleEvent(object source, EventArgs args) { for (Control control =this.Parent; control !=null; control = control.Parent) { if (control.OnBubbleEvent(source, args)) { return; } } }
public class ReverseWords {
/**
* 题目:颠倒一个句子中的词的顺序。比如: I am a student颠倒后变成:student a am I.词以空格分隔。
* 要求:
* 1.实现速度最快,移动最少
* 2.不能使用String的方法如split,indexOf等等。
* 解答:两次翻转。
*/
publ
oracle外部表是只允许只读访问,不能进行DML操作,不能创建索引,可以对外部表进行的查询,连接,排序,创建视图和创建同义词操作。
you can select, join, or sort external table data. You can also create views and synonyms for external tables. Ho
发现一个老外写的不错的jquery插件,可以实现将HTML
表格导出为excel,pdf等格式,
地址在:
https://github.com/kayalshri/
下面看个例子,实现导出表格到excel,pdf
<html>
<head>
<title>Export html table to excel an