随笔 - 4  文章 - 0 评论 - 46 trackbacks - 2
<2008年6月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

与我联系

搜索

 

常用链接

留言簿

我参加的小组

我参与的团队

随笔档案

相册

最新评论

阅读排行榜

评论排行榜

    自定义控件相对用户控件来说开发相当麻烦,对于新手而言更是觉得不敢涉入。然而基于当年asp的开发经验,我觉得对于分页而言,其基本功能是很少的。无需多么复杂的功能。类图如下:

 

从基本理论上来分析,我们只需要分页控件设置好记录总数(RecordCount)及页面显示记录数(PageSize)以后自动生成如下图所示的效果。


 

当单击其中的某个页时,触发控件的PageCahane事件,返回事件对象(PageArgs),它只含有一个属性CurPage,用它来指定用户单击的页数。

当单击[上一页]时返回当前页减1的值,如当前是第二页,单击[上一页]时,(PageArgs.CurPage)返回1。显示时只要控制好当前页,并且让[上一页]在当前页为1时不显示,[下一页]在当前页为最后一页时不显示。

       显示部分我们用RenderContents()去控制就可以,代码如下:

 1            writer.Write("<div class=\"\">\n");
 2            writer.Write("记录数:");
 3            writer.Write(RecordCount);
 4            writer.Write(" 总页数:");
 5            writer.Write(PageCount+" ");
 6            if (CurPage != 1)
 7          {
 8                writer.Write("<a href=\"javascript:_doPost('" + (CurPage - 1) + "')\">上一页</a>\n ");
 9            }

10            for (int i = 1; i <= PageCount; i++)
11          {
12                if (i == CurPage)
13              {
14                    writer.Write("<a href=\"javascript:_doPost('" + i + "')\">" + i + "</a>\n ");
15                }

16                else
17              {
18                    writer.Write("<a href=\"javascript:_doPost('" + i + "')\">[" + i + "]</a>\n ");
19                }

20            }

21            if(CurPage  != PageCount)
22          {
23                writer.Write("<a href=\"javascript:_doPost('" + (CurPage + 1) + "')\">下一页</a>\n");
24            }

25            writer.Write("</div>\n");
26
 

这里大家注意到那个\n了没有,这个很有意思,开始我发现插入的代码全是一整行的。虽然不影响使用,但是查看源代码时很不方便,插入\n是一个好习惯。这样可以保证生成的客户端源码也是整齐美观的。

然后就是事件的捕获问题了。我们可以不去考虑太多关于自定义控件的特性及模式等复杂的知识。

在这里,我们只需要了解事件的回发机制就行。在基本的控件回发机制中,客户端通过表单的submit提交,服务器端会根据提交中ID值在控件树中查找对应于ID的控件,如果找到就引发RaisePostBackEvent()方法。当然,前提是控件必须实现IpostBackEventHandler接口。也就是说,只要我们的自定义控件实现了IpostBackEventHandler接口,那么它就可以捕获客户端POST提交的相应ID的事件了。(注:这里的这个ID很重要,开始没有设,总是捕获不到事件)

然而,对于<intput>之类很简单,我们只需设<input name=”+this.UniqueID+”>即可完成客户端与服务器端的对应。但是,我们这里用了<a href>,它不能引发提交,所以我们必须用js去引发。

这样,我们还需在客户端动态插入一段代码,我这里是在OnPreRender(EventArgs e)中实现的。代码如下:

    
 1      protected override void OnPreRender(EventArgs e)
 2    {
 3            base.OnPreRender(e);
 4            string dopost = "<div>\n";
 5            dopost +=       "   <input type=\"hidden\" name=\"" + this.UniqueID + "\" id=\"__EVENTTARGET\" value=\"\" />\n";
 6            dopost +=       "</div>\n";
 7            dopost +=       "<script type=text/javascript>\n";
 8            dopost +=       "      function _doPost(cutomArg){\n";
 9            dopost +=       "          document.forms['form1']."+this.UniqueID+".value = cutomArg;\n";
10            dopost +=       "          document.forms['form1'].submit();\n";
11            dopost +=       "      }\n";
12            dopost +=       "</script>\n";
13            if (!Page.ClientScript.IsClientScriptIncludeRegistered(this.GetType(), "_doPost"))
14          {
15                Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "_doPost", dopost);
16            }

17   }

18
 

我们插入一个隐藏控件用来保存提交的值,最后的IsClientScriptIncludeRegistered方法用于防止重复插入相同脚本。RegisterClientScriptBlock用于注册当前脚本,其实就是插入到客户端.

捕获回发代码如下:

        
1   public void RaisePostBackEvent(string eventArgument)
2 {
3            this.CurPage = Int32.Parse(System.Web.HttpContext.Current.Request.Form[this.UniqueID].ToString());
4            PageArgs e = new PageArgs();
5            e.CurPage = CurPage;
6            OnPageChange(this, e);
7   }

8

      捕获到客户端回发事件后。我们获取提交的值(这里的获取方法很僵硬,我总觉得还有别的方法,但是还没有发现),并设当前页(this.CurPage)为新值,然后引发事件OnPageCahage(this, e).

这样我们完成了一个简单的分页控件的开发。

      提供源码下载  
     
posted on 2008-06-18 16:17 acro 阅读(2269) 评论(24)  编辑 收藏

FeedBack:
#1楼  2008-06-18 16:31 牧师.net      
good~~
  回复  引用  查看    
#2楼  2008-06-18 16:32 石牌村夫      
如果不做成控件的话,感觉还要简单些啊
  回复  引用  查看    
#3楼 [楼主] 2008-06-18 16:37 acro      
@石牌村夫
作成控件主要是为了复用.

  回复  引用  查看    
可能对新手来说,有点困难
  回复  引用    
#5楼  2008-06-18 17:19 囚徒 [未注册用户]
问题不是可能所有分页都只用这一种样式晒,貌似复用也是扯谈
  回复  引用    
#6楼  2008-06-18 17:43 没剑      
加上cssClass属性。。。
  回复  引用  查看    
#7楼  2008-06-18 17:43 leleroyn [未注册用户]
aspnetpager 非常强大。有源码。用的也放心。
我现在一直在用
  回复  引用    
#8楼 [楼主] 2008-06-18 18:06 acro      
@囚徒
本来就是学习用的.
样式也完全可以做成属性放出去.

不过是更复杂一点而已.
简单点,容易看懂些,关键是懂得原理
  回复  引用  查看    
#9楼 [楼主] 2008-06-18 18:06 acro      
@leleroyn
功能强大的控件很多的.但是我们不能就停滞不前,只用现成的.不去研究它啊.
  回复  引用  查看    
#10楼  2008-06-18 19:21 kuafoo      
把 string 换成 stringBuilder 然后用AppendLine 效率高了 也不用添加 \n 了
  回复  引用  查看    
#11楼  2008-06-18 21:24 李涛      
楼主想法很好,学习一定要主动,研究当然也一定要主动,现成的很多控件是不错,关键是要理解其中的奥妙
  回复  引用  查看    
#12楼  2008-06-18 22:28 心有灵犀      
同意楼上的,知其然还要知其所以然
  回复  引用  查看    
#13楼  2008-06-19 00:41 私家侦探      
最近有一个前无古人的思路,就是把分页空间的相关设置,比如什么"上一页","下一页"等文本显示设置等统统用css搞,也就是分页控件不必再提供一些设置属性给页面用了,已经都用css文件传递给它了,这样就可以每个大点模块都使用同一个分页css文件,一个项目使用好几个分页css,只要在页面中引入css文件,就达到配置分页控件的目的,这样就做到很灵活又简单的目的,css中可以使用js代码,所以操作分页控件不成问题
  回复  引用  查看    
@私家侦探
使用css来统一控制分页控件的样式,恐怕照旧有人这么做了吧。
至于使用css来控制文字,可能还没有人。但是思路肯定有很多人都想到了。

那么在css里面如何写js代码呢?
  回复  引用  查看    
#15楼  2008-06-19 09:10 王孟军!      
楼主
有时间,我把控件的样式做成统一的样式文件
这是小弟的MSN:wmj2212@126.com
有时间交流一下
  回复  引用  查看    
#16楼  2008-06-19 21:08 艾飞      
樓主這個如果有100頁的話……
看看我的吧。http://airfeeling.cnblogs.com/
  回复  引用  查看    
#17楼  2008-06-19 21:42 小眼睛老鼠      
我也做过
但是由于对事件机制不大了解
我做的分页就比较简单了
通过get的方法传pageindex参数
外部属性就是一个
count // 消息条数
pagesize // 每页的消息数
pageindex // 当前页索引
pagecount // 显示的页码数
pageurl // 这个如果不指定就从request里取url 主要争对url重定向
好像就这么多
不过思想都是一样的
只有部分实现不一样而已
你用的post 更好点 我用的get
不过这个新手看汗真有点吃力 因为用到了事件
  回复  引用  查看    
收藏。
  回复  引用  查看    
#19楼  2008-06-24 16:25 火无极      
很好很强大
  回复  引用  查看    
#20楼  2008-07-11 15:54 汉广      
不错
  回复  引用  查看    
#21楼  2008-07-11 15:58 汉广      
不过你这样post回去
function __doPostBack(eventTarget, eventArgument) {
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
theForm.__EVENTTARGET.value = eventTarget;
theForm.__EVENTARGUMENT.value = eventArgument;
theForm.submit();
}
}
这个函数就不运行了,页面其它控件的状态、、、、、、、、
  回复  引用  查看    
#22楼  2008-07-11 16:32 汉广      
对不起,我对事件回发机制不太熟悉 ,刚才想错啦。汗。。。。。。
  回复  引用  查看    
#23楼  2008-08-17 17:42 window5549-accp      
PDALA
ss

  回复  引用  查看    
#24楼  2008-09-03 12:05 Brian1 [未注册用户]
我想知道你这个控件可以对GridView分页吗?如果可以,可以给我说下具体的操作吗?
  回复  引用    

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
博客园首页

新闻频道

社区

小组

博问

网摘

闪存

  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-18 16:21 编辑过
成果网帮您增加网站收入


相关链接: