先给出本人在实例中的代码下载,供各种鸟们使用,大鸟们也可以绕过:
下载地址,点击即可下载:http://files.cnblogs.com/learnyou/ajaxpage.rar
下面说说该自定义无刷新分页控件原理:
使用工具:Access + VS2008
为了方便大家直接使用,源码中是使用了Access文件数据库的,下载源码后直接简单修改下代码中数据库路径就可以运行了。
使用框架:Ajax,是我是我还是我,还是Ajax实现的无刷新,但是本实例中,本人对相关控件的封装,个人觉得使用还是挺方便、挺简单。
数据库是使用的Access数据库,表很简单,就是一个学生表(students),该表就是三列,很简单的数据结构,在此就不贴出截图了,大家可以直接用office打开源码中的数据库看看就是。
下面给出核心代码,都是本人直接封装的,在App_Code文件夹的AjaxPager.cs文件中,也可以直接在下载的源码中查看,代码如下:
- 1 using System;
- 2 using System.Text;
- 3 using System.Collections;
- 4 using System.Collections.Generic;
- 5 using System.Text.RegularExpressions;
- 6 using System.IO;
- 7 using System.Web.UI;
- 8 using System.Globalization;
- 9 using System.Web.UI.WebControls;
- 10 using System.Web.UI.HtmlControls;
- 11
- 12 namespace Demo
- 13 {
- 14 public interface IPageIndexChangedEventHandler
- 15 {
- 16 void BindData(int pageIndex,int pageSize);
- 17 }
- 18
- 19 public class AjaxPager : Control,ICallbackEventHandler,INamingContainer
- 20 {
- 21 #region Member Variables
- 22
- 23 private int lowerBound;
- 24 private int upperBound;
- 25 private HyperLink prevIoUsLink;
- 26 private HyperLink nextLink;
- 27 private HyperLink firstLink;
- 28 private HyperLink lastLink;
- 29 private Control targetControl;
- 30
- 31 #endregion
- 32
- 33 #region Public Properties
- 34
- 35 public int PageIndex
- 36 {
- 37 get
- 38 {
- 39 int pageIndex = 1;
- 40 if (Page != null && Page.IsPostBack && ViewState["PageIndex"] != null)
- 41 {
- 42 pageIndex = (int)ViewState["PageIndex"];
- 43 }
- 44 if (pageIndex < 1)
- 45 {
- 46 return 1;
- 47 }
- 48 else
- 49 {
- 50 return pageIndex;
- 51 }
- 52 }
- 53 set
- 54 {
- 55 ViewState["PageIndex"] = value;
- 56 }
- 57 }
- 58 public int PageSize
- 59 {
- 60 get
- 61 {
- 62 int pageSize = Convert.ToInt32(ViewState["PageSize"]);
- 63 if (pageSize <= 0)
- 64 {
- 65 return 10;
- 66 }
- 67 return pageSize;
- 68 }
- 69 set
- 70 {
- 71 ViewState["PageSize"] = value;
- 72 }
- 73 }
- 74 public int LeftLength
- 75 {
- 76 get
- 77 {
- 78 return PageLength / 2;
- 79 }
- 80 }
- 81 public int RightLength
- 82 {
- 83 get
- 84 {
- 85 return PageLength / 2;
- 86 }
- 87 }
- 88 public int PageLength
- 89 {
- 90 get
- 91 {
- 92 int pageLength = Convert.ToInt32(ViewState["PageLength"]);
- 93
- 94 if (pageLength <= 3)
- 95 return 3;
- 96
- 97 if (pageLength % 2 == 0)
- 98 {
- 99 return pageLength + 1;
- 100 }
- 101
- 102 return pageLength;
- 103 }
- 104 set
- 105 {
- 106 ViewState["PageLength"] = value;
- 107 }
- 108
- 109 }
- 110 public int TotalPages
- 111 {
- 112 get
- 113 {
- 114 return CalculateTotalPages(TotalRecords);
- 115 }
- 116 }
- 117 public int TotalRecords
- 118 {
- 119 get
- 120 {
- 121 return Convert.ToInt32(ViewState["TotalRecords"]);
- 122 }
- 123 set
- 124 {
- 125 ViewState["TotalRecords"] = value;
- 126 }
- 127 }
- 128 public string DataWrapperID
- 129 {
- 130 get
- 131 {
- 132 string s = ViewState["DataWrapperID"] as string;
- 133 if (s == null)
- 134 {
- 135 s = string.Empty;
- 136 }
- 137 return s;
- 138 }
- 139 set
- 140 {
- 141 ViewState["DataWrapperID"] = value;
- 142 }
- 143 }
- 144 public string TargetControlID
- 145 {
- 146 get
- 147 {
- 148 string s = ViewState["TargetControlID"] as string;
- 149 if (s == null)
- 150 {
- 151 s = string.Empty;
- 152 }
- 153 return s;
- 154 }
- 155 set
- 156 {
- 157 ViewState["TargetControlID"] = value;
- 158 }
- 159 }
- 160
- 161 #endregion
- 162
- 163 #region Overrides Methods
- 164
- 165 protected override void OnLoad(EventArgs e)
- 166 {
- 167 if (!Page.IsPostBack)
- 168 {
- 169 CreatePageLinks();
- 170 RegisterClientScripts();
- 171 }
- 172 else
- 173 {
- 174 targetControl = FindControl(this,TargetControlID);
- 175 }
- 176 }
- 177 protected override void Render(HtmlTextWriter writer)
- 178 {
- 179 if (TotalPages <= 1)
- 180 {
- 181 return;
- 182 }
- 183 RenderFirst(writer);
- 184 RenderPrevIoUs(writer);
- 185 RenderPagingButtons(writer);
- 186 RenderNext(writer);
- 187 RenderLast(writer);
- 188 }
- 189
- 190 #endregion
- 191
- 192 #region Public Methods
- 193
- 194 public virtual int CalculateTotalPages(int totalRecords)
- 195 {
- 196 int totalPagesAvailable;
- 197
- 198 if (totalRecords == 0)
- 199 {
- 200 return 0;
- 201 }
- 202
- 203 totalPagesAvailable = totalRecords / PageSize;
- 204
- 205 if ((totalRecords % PageSize) > 0)
- 206 {
- 207 totalPagesAvailable++;
- 208 }
- 209
- 210 return totalPagesAvailable;
- 211
- 212 }
- 213
- 214 #endregion
- 215
- 216 }
- 217 }
好了,基本就是这么多,源码在文章开头部分,可以直接down下来看看就是。本人觉得这种封装方式实现效果还行,当前项目中就有应用,大家可以看看效果,见网址:http://www.bjp111.com
源码较多,本人只贴出了一部分,还请大家见谅,更多部分可以直接下载源码,VS打开就是,里面很清楚。就先到这里,大家有什么问题可以直接留言交流。