做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件。
翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册。
有图有真相,给个直观的认识:
自定义分页控件前台代码:
| 代码如下 | 复制代码 | 
| 
  .pager-m-l { 
  margin-left: 10px; 
 } 
 .pager { 
  font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; 
  font-size: 14px; 
  color: #333; 
  background-color: #fff; 
  text-align: center; 
  border: 1px solid #eee; 
  border-radius: 5px; 
  height: 30px; 
  line-height: 30px; 
  margin: 10px auto; 
  width: 650px; 
 } 
 .font-blue { 
  color: #5bc0de; 
 } 
 .pager a { 
  color: #5bc0de; 
  text-decoration: none; 
 } 
  .pager a.gray { 
   color: #808080; 
  } 
 .pager-num { 
  width: 30px; 
  text-align: center; 
 } 
 .pager-form-control { 
  color: #555; 
  background-color: #fff; 
  background-image: none; 
  border: 1px solid #ccc; 
  border-radius: 4px; 
  -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 
  box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); 
  -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; 
  -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 
  transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; 
  padding: 2px 0px; 
  margin: 0px 2px; 
 } 
  .pager-form-control:focus { 
   border-color: #66afe9; 
   outline: 0; 
   -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); 
   box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); 
  } 
 .btn { 
  display: inline-block; 
  padding: 2px; 
  font-weight: normal; 
  text-align: center; 
  white-space: nowrap; 
  vertical-align: middle; 
  -ms-touch-action: manipulation; 
  touch-action: manipulation; 
  cursor: pointer; 
  -webkit-user-select: none; 
  -moz-user-select: none; 
  -ms-user-select: none; 
  user-select: none; 
  background-image: none; 
  border: 1px solid transparent; 
  border-radius: 4px; 
 } 
 .btn-default { 
  color: #333; 
  background-color: #fff; 
  border-color: #ccc; 
 } 
 当前 
  | 
  | 
  | 
  条/每页 
自定义分页控件后台代码: privateconststringviewStateCurrentPageIndex ="CurrentPageIndex"; 
  privateconststringviewStateRecordCount ="RecordCount"; 
  publicdelegatevoidPageChangedHandle(); 
  publiceventPageChangedHandle OnPageChanged; 
  publicintPageSize 
  { 
   get 
   { 
    returnConvert.ToInt32(ddlPageSize.SelectedValue); 
   } 
  } 
  publicintCurrentPageIndex 
  { 
   set 
   { 
    ViewState[viewStateCurrentPageIndex] = value; 
   } 
   get 
   { 
    if(ViewState[viewStateCurrentPageIndex] ==null) 
    { 
     ViewState[viewStateCurrentPageIndex] = 1; 
    } 
    returnConvert.ToInt32(ViewState[viewStateCurrentPageIndex]); 
   } 
  } 
  publicintRecordCount 
  { 
   get 
   { 
    if(ViewState[viewStateRecordCount] ==null) 
    { 
     ViewState[viewStateRecordCount] = 0; 
    } 
    returnConvert.ToInt32(ViewState[viewStateRecordCount]); 
   } 
   set 
   { 
    ViewState[viewStateRecordCount] = value; 
   } 
  } 
  privateintTotalNumberOfPages 
  { 
   get 
   { 
    returnRecordCount % PageSize == 0 ? RecordCount / PageSize : (RecordCount / PageSize) + 1; 
   } 
  } 
  protectedvoidPage_Load(objectsender, EventArgs e) 
  { 
   if(!IsPostBack) 
   { 
   } 
  } 
  protectedvoidlabFirstPage_Click(objectsender, EventArgs e) 
  { 
   CurrentPageIndex = 1; 
   this.DataBind(); 
  } 
  protectedvoidlabPreviousPage_Click(objectsender, EventArgs e) 
  { 
   CurrentPageIndex -= 1; 
   this.DataBind(); 
  } 
  protectedvoidlabNextPage_Click(objectsender, EventArgs e) 
  { 
   CurrentPageIndex += 1; 
   this.DataBind(); 
  } 
  protectedvoidlabLastPage_Click(objectsender, EventArgs e) 
  { 
   CurrentPageIndex = TotalNumberOfPages; 
   this.DataBind(); 
  } 
  protectedvoidbtnGo_Click(objectsender, EventArgs e) 
  { 
   intpageNum = 1; 
   boolisNum = Int32.TryParse(txtPageNum.Text,outpageNum); 
   if(isNum) 
   { 
    CurrentPageIndex = Math.Min(pageNum, TotalNumberOfPages); 
   } 
   this.DataBind(); 
  } 
  protectedvoidddlPageSize_SelectedIndexChanged(objectsender, EventArgs e) 
  { 
   CurrentPageIndex = 1; 
   this.DataBind(); 
  } 
  protectedoverridevoidDataBind(boolraiseOnDataBinding) 
  { 
   BindPager(); 
   base.DataBind(raiseOnDataBinding); 
   if(OnPageChanged !=null) 
   { 
    OnPageChanged(); 
   } 
  } 
  privatevoidBindPager() 
  { 
   labCurrentPageIndex.Text = CurrentPageIndex.ToString(); 
   labTotalNumberOfPages.Text = TotalNumberOfPages.ToString(); 
   labRecordCount.Text = RecordCount.ToString(); 
   SetNavigateEnabled(); 
  }  
  privatevoidSetNavigateEnabled() 
  { 
   txtPageNum.Text = CurrentPageIndex.ToString(); 
   labFirstPage.Enabled =true; 
   labPreviousPage.Enabled =true; 
   labNextPage.Enabled =true; 
   labLastPage.Enabled =true; 
   labFirstPage.CssClass ="font-blue"; 
   labPreviousPage.CssClass ="font-blue"; 
   labNextPage.CssClass ="font-blue"; 
   labLastPage.CssClass ="font-blue"; 
   if(CurrentPageIndex == 1) 
   { 
    labFirstPage.Enabled =false; 
    labPreviousPage.Enabled =false; 
    labFirstPage.CssClass ="gray"; 
    labPreviousPage.CssClass ="gray"; 
   } 
   if(CurrentPageIndex == TotalNumberOfPages) 
   { 
    labNextPage.Enabled =false; 
    labLastPage.Enabled =false; 
    labNextPage.CssClass ="gray"; 
    labLastPage.CssClass ="gray"; 
   } 
   if(RecordCount == 0) 
   { 
    labFirstPage.Enabled =false; 
    labPreviousPage.Enabled =false; 
    labFirstPage.CssClass ="gray"; 
    labPreviousPage.CssClass ="gray"; 
    labNextPage.Enabled =false; 
    labLastPage.Enabled =false; 
    labNextPage.CssClass ="gray"; 
    labLastPage.CssClass ="gray"; 
   } 
  } 
 | |
当前页码、总共多少条记录使用ViewState记录状态信息,因为导航控件会引起回发刷新。
分页后的数据加载,使用事件。
事件的具体实现放在使用分页控件的具体页面中,进行事件的注册。
测试分页控件的前台页面:
| 代码如下 | 复制代码 | 
| 
   text: 
 | |
测试分页控件的后台代码:
| 代码如下 | 复制代码 | 
| 
 privateconststringdtSourceViewStateKey ="dtSourceViewStateKey"; 
protectedvoidPage_Load(objectsender, EventArgs e) 
{ 
 if(!IsPostBack) 
 { 
 BindData(true); 
 } 
 Pager.OnPageChanged += OnPageChanged; 
} 
privatevoidBindData(boolbindRecordCount) 
{ 
 DataTable dtSource = GetDataSource(); 
 var source = dtSource.AsEnumerable(); 
 if(!string.IsNullOrEmpty(txtContent.Text.Trim())) 
 { 
 source = source.Where(w => w.Field 
 } 
 if(bindRecordCount) 
 { 
 Pager.RecordCount = source.Count(); 
 Pager.CurrentPageIndex = 1; 
 Pager.DataBind(); 
 } 
 gvList.DataSource = source 
 .Skip((Pager.CurrentPageIndex - 1) * Pager.PageSize) 
 .Take(Pager.PageSize) 
 .Select(r =>new{ id = r["id"].ToString(), text = r["text"].ToString() }) 
 .ToList(); 
 gvList.DataBind(); 
} 
privatevoidOnPageChanged() 
{ 
 BindData(false); 
} 
privateDataTable InitDataTable() 
{ 
 DataTable dtSource =newDataTable(); 
 DataColumn id =newDataColumn("id"); 
 id.AutoIncrement =true; 
 id.AutoIncrementSeed = 1; 
 dtSource.Columns.Add(id); 
 dtSource.Columns.Add("text"); 
 for(inti = 1; i <= 1000; i++) 
 { 
 DataRow dr = dtSource.NewRow(); 
 dr["text"] ="内容"+ i; 
 dtSource.Rows.Add(dr); 
 } 
 returndtSource; 
} 
privateDataTable GetDataSource() 
{ 
 if(ViewState[dtSourceViewStateKey] ==null) 
 { 
 ViewState[dtSourceViewStateKey] = InitDataTable(); 
 } 
 returnViewState[dtSourceViewStateKey]asDataTable; 
} 
protectedvoidbtnQuery_Click(objectsender, EventArgs e) 
{ 
 BindData(true); 
} 
 | |
在Page_Load中注册翻页后的事件。