您好,欢迎来到安汇情感。
搜索
您的当前位置:首页asp.net webform自定义分页控件

asp.net webform自定义分页控件

来源:安汇情感


做web开发一直用到分页控件,自己也动手实现了个,使用用户自定义控件。

翻页后数据加载使用委托,将具体实现放在在使用分页控件的页面进行注册。

有图有,给个直观的认识:

自定义分页控件前台代码:

<style type="text/css">
 .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;
 }
</style>
<div class="pager">
 <span>当前<asp:Label runat="server" ID="labCurrentPageIndex" CssClass="font-blue"></asp:Label>/<asp:Label runat="server" CssClass="font-blue" ID="labTotalNumberOfPages"></asp:Label>页</span>
 <span class="pager-m-l">共<asp:Label runat="server" CssClass="font-blue" ID="labRecordCount"></asp:Label>条记录</span>
 <span class="pager-m-l">
 <asp:LinkButton runat="server" ID="labFirstPage" OnClick="labFirstPage_Click">首页</asp:LinkButton>
 |
 <asp:LinkButton runat="server" ID="labPreviousPage" OnClick="labPreviousPage_Click">上一页</asp:LinkButton>
 |<asp:LinkButton runat="server" ID="labNextPage" OnClick="labNextPage_Click">下一页</asp:LinkButton>
 |<asp:LinkButton runat="server" ID="labLastPage" OnClick="labLastPage_Click">尾页</asp:LinkButton>
 </span>
 <span class="pager-m-l">跳至<asp:TextBox runat="server" ID="txtPageNum" CssClass="pager-form-control pager-num">1</asp:TextBox>页
 <asp:Button runat="server" Text="GO" ID="btnGo" CssClass="btn btn-default" OnClick="btnGo_Click" /></span>
 <span class="pager-m-l">
 <asp:DropDownList runat="server" ID="ddlPageSize" CssClass="pager-form-control" AutoPostBack="true" OnSelectedIndexChanged="ddlPageSize_SelectedIndexChanged">
 <asp:ListItem Text="10" Value="10"></asp:ListItem>
 <asp:ListItem Text="20" Value="20"></asp:ListItem>
 <asp:ListItem Text="30" Value="30"></asp:ListItem>
 <asp:ListItem Text="50" Value="50"></asp:ListItem>
 <asp:ListItem Text="100" Value="100"></asp:ListItem>
 </asp:DropDownList>条/每页</span>
</div>

自定义分页控件后台代码:

private const string viewStateCurrentPageIndex = "CurrentPageIndex";
 private const string viewStateRecordCount = "RecordCount";

 public delegate void PageChangedHandle();
 public event PageChangedHandle OnPageChanged;

 public int PageSize
 {
 get
 {
 return Convert.ToInt32(ddlPageSize.SelectedValue);
 }
 }

 public int CurrentPageIndex
 {
 set
 {
 ViewState[viewStateCurrentPageIndex] = value;
 }
 get
 {
 if (ViewState[viewStateCurrentPageIndex] == null)
 {
 ViewState[viewStateCurrentPageIndex] = 1;
 }

 return Convert.ToInt32(ViewState[viewStateCurrentPageIndex]);
 }
 }
 public int RecordCount
 {
 get
 {
 if (ViewState[viewStateRecordCount] == null)
 {
 ViewState[viewStateRecordCount] = 0;
 }

 return Convert.ToInt32(ViewState[viewStateRecordCount]);
 }
 set
 {
 ViewState[viewStateRecordCount] = value;
 }
 }
 private int TotalNumberOfPages
 {
 get
 {
 return RecordCount % PageSize == 0 ? RecordCount / PageSize : (RecordCount / PageSize) + 1;
 }
 }

 protected void Page_Load(object sender, EventArgs e)
 {
 if (!IsPostBack)
 {

 }
 }

 protected void labFirstPage_Click(object sender, EventArgs e)
 {
 CurrentPageIndex = 1;

 this.DataBind();
 }

 protected void labPreviousPage_Click(object sender, EventArgs e)
 {
 CurrentPageIndex -= 1;

 this.DataBind();
 }

 protected void labNextPage_Click(object sender, EventArgs e)
 {
 CurrentPageIndex += 1;

 this.DataBind();
 }

 protected void labLastPage_Click(object sender, EventArgs e)
 {
 CurrentPageIndex = TotalNumberOfPages;

 this.DataBind();
 }

 protected void btnGo_Click(object sender, EventArgs e)
 {
 int pageNum = 1;
 bool isNum = Int32.TryParse(txtPageNum.Text, out pageNum);
 if (isNum)
 {
 CurrentPageIndex = Math.Min(pageNum, TotalNumberOfPages);
 }

 this.DataBind();
 }

 protected void ddlPageSize_SelectedIndexChanged(object sender, EventArgs e)
 {
 CurrentPageIndex = 1;

 this.DataBind();
 }

 protected override void DataBind(bool raiseOnDataBinding)
 {
 BindPager();
 base.DataBind(raiseOnDataBinding);

 if (OnPageChanged != null)
 {
 OnPageChanged();
 }
 }

 private void BindPager()
 {
 labCurrentPageIndex.Text = CurrentPageIndex.ToString();
 labTotalNumberOfPages.Text = TotalNumberOfPages.ToString();
 labRecordCount.Text = RecordCount.ToString();

 SetNavigateEnabled();
 } 

 private void SetNavigateEnabled()
 {
 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记录状态信息,因为导航控件会引起回发刷新。
分页后的数据加载,使用事件。

事件的具体实现放在使用分页控件的具体页面中,进行事件的注册。

测试分页控件的前台页面:

<div style="margin-bottom:10px;">
 text:
 <asp:TextBox ID="txtContent" runat="server"></asp:TextBox>
 <asp:Button ID="btnQuery" runat="server" Text="查 询" OnClick="btnQuery_Click"/>
 </div>
 <div>
 <asp:GridView ID="gvList" runat="server" Width="99%" AutoGenerateColumns="true"></asp:GridView>
 <uc1:PagerControl runat="server" ID="Pager" />
</div>

测试分页控件的后台代码:

 private const string dtSourceViewStateKey = "dtSourceViewStateKey";

 protected void Page_Load(object sender, EventArgs e)
 {
 if (!IsPostBack)
 {
 BindData(true);

 }
 Pager.OnPageChanged += OnPageChanged;
 }

 private void BindData(bool bindRecordCount)
 {
 DataTable dtSource = GetDataSource();
 

 var source = dtSource.AsEnumerable();
 if (!string.IsNullOrEmpty(txtContent.Text.Trim()))
 {
 source = source.Where(w => w.Field<string>("text").Contains(txtContent.Text.Trim()));
 }

 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();
 }

 private void OnPageChanged()
 {
 BindData(false);
 }

 private DataTable InitDataTable()
 {
 DataTable dtSource = new DataTable();
 DataColumn id = new DataColumn("id");
 id.AutoIncrement = true;
 id.AutoIncrementSeed = 1;

 dtSource.Columns.Add(id);
 dtSource.Columns.Add("text");

 for (int i = 1; i <= 1000; i++)
 {
 DataRow dr = dtSource.NewRow();
 dr["text"] = "内容" + i;

 dtSource.Rows.Add(dr);
 }

 return dtSource;
 }

 private DataTable GetDataSource()
 {
 if (ViewState[dtSourceViewStateKey] == null)
 {
 ViewState[dtSourceViewStateKey] = InitDataTable();
 }

 return ViewState[dtSourceViewStateKey] as DataTable;
 }

 protected void btnQuery_Click(object sender, EventArgs e)
 {
 BindData(true);
 }

在Page_Load中注册翻页后的事件。

Copyright © 2019- ahftz.com 版权所有

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务