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] = ;
} return Convert.ToInt32(ViewState[viewStateCurrentPageIndex]);
}
}
public int RecordCount
{
get
{
if (ViewState[viewStateRecordCount] == null)
{
ViewState[viewStateRecordCount] = ;
} return Convert.ToInt32(ViewState[viewStateRecordCount]);
}
set
{
ViewState[viewStateRecordCount] = value;
}
}
private int TotalNumberOfPages
{
get
{
return RecordCount % PageSize == ? RecordCount / PageSize : (RecordCount / PageSize) + ;
}
} protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{ }
} protected void labFirstPage_Click(object sender, EventArgs e)
{
CurrentPageIndex = ; this.DataBind();
} protected void labPreviousPage_Click(object sender, EventArgs e)
{
CurrentPageIndex -= ; this.DataBind();
} protected void labNextPage_Click(object sender, EventArgs e)
{
CurrentPageIndex += ; this.DataBind();
} protected void labLastPage_Click(object sender, EventArgs e)
{
CurrentPageIndex = TotalNumberOfPages; this.DataBind();
} protected void btnGo_Click(object sender, EventArgs e)
{
int pageNum = ;
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 = ; 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 == )
{
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 == )
{
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 = ;
Pager.DataBind();
}
gvList.DataSource = source
.Skip((Pager.CurrentPageIndex - ) * 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 = ;
dtSource.Columns.Add(id);
dtSource.Columns.Add("text");
for (int i = ; i <= ; 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中注册翻页后的事件。
asp.net webform 自定义分页控件的更多相关文章
- C# DataGridView自定义分页控件
好些日子不仔细写C#代码了,现在主要是Java项目,C#.Net相关项目不多了,有点手生了,以下代码不足之处望各位提出建议和批评. 近日闲来无事想研究一下自定义控件,虽然之前也看过,那也仅限于皮毛,粗 ...
- Mvc自定义分页控件
MVC开发分页常常使用第三方控件,生成的分页HTML带有版权申明,虽然免费,但是总有的别扭.于是,某日,楼主闲来蛋疼,折腾了个自定义分页控件: 先来展示下效果图: 1>当分页不超过10页的时候, ...
- WPF自定义分页控件,样式自定义,简单易用
WPF自定义分页控件 做了许久伸手党,终于有机会贡献一波,搜索一下WPF分页控件,还是多,但是不太通用,主要就是样式问题,这个WPF很好解决,还有一个就是分页控件嘛,只关心几个数字的变动就行了,把页码 ...
- asp.net中自定义验证控件
在windows2003中,可能iis版本太底,不支持TextBox的类型设为Number类型,所以会报错,所以去掉后直接用验证控件来控制必须输入数字好了. <asp:RegularExpres ...
- Winform自定义分页控件的实现
实现效果 有点丑陋 但是功能是没问题的 测试过 实现思路 先创建一个用户控件 代码实现 public partial class PagerControl : UserControl { ; /// ...
- winform 自定义分页控件 及DataGridview数据绑定
分页效果如上图所示,用到的控件均为基本控件 ,其方法如下 右击项目-添加-新建项 选择用户控件 然后在用户控件中拖入所需要的Label,Button,Text 用户控件全部代码: using Syst ...
- WPF管理系统自定义分页控件 - WPF特工队内部资料
最近做一个演示的管理系统项目,需要用到分页控件,在网上找了很多,依然找到与UI模版匹配的,最后干脆自己写一个. 分页控件分析: 1.分页控件分简单显示和复杂显示两种: 2.包含上一页.下一页以及页码明 ...
- WPF 自定义分页控件二
一:添加自定义分页控件,命名为KDataPagerTwo: public class KDataPagerTwo : Control, INotifyPropertyChanged { static ...
- 自定义分页控件-基于Zhifeiya的分页控件改版
基于Zhifeiya的分页控件改版的分页. html显示代码: <div class="pagelist"> {{.pagerHtml}} </div> c ...
随机推荐
- angular2系列教程(八)In-memory web api、HTTP服务、依赖注入、Observable
大家好,今天我们要讲是angular2的http功能模块,这个功能模块的代码不在angular2里面,需要我们另外引入: index.html <script src="lib/htt ...
- 计算机程序的思维逻辑 (60) - 随机读写文件及其应用 - 实现一个简单的KV数据库
57节介绍了字节流, 58节介绍了字符流,它们都是以流的方式读写文件,流的方式有几个限制: 要么读,要么写,不能同时读和写 不能随机读写,只能从头读到尾,且不能重复读,虽然通过缓冲可以实现部分重读,但 ...
- Consul 服务注册与服务发现
上一篇:Mac OS.Ubuntu 安装及使用 Consul 1. 服务注册 对 Consul 进行服务注册之前,需要先部署一个服务站点,我们可以使用 ASP.NET Core 创建 Web 应用程序 ...
- 简记用ArcGIS处理某项目需求中数据的步骤
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目需求涉及如下几个步骤: a.矢量化 b.获取范围内要素 ...
- 编写高质量代码:改善Java程序的151个建议(第8章:异常___建议114~117)
建议114:不要在构造函数中抛出异常 Java异常的机制有三种: Error类及其子类表示的是错误,它是不需要程序员处理也不能处理的异常,比如VirtualMachineError虚拟机错误,Thre ...
- 网站里加入QQ在线客服
1.开启"QQ在线状态"服务 http://jingyan.baidu.com/article/b24f6c823425a586bfe5da1f.html http://www. ...
- BPM配置故事之案例13-触发消息通知
老李:小明! 小明:--见你就没好事,又要我干嘛? 老李:额,小事小事,最近很多部门都觉得Boss的审批速度太慢了,能不能以后给审批人一个消息提醒? 小明:--有一种不太好的预感 老李:怎么,很困难么 ...
- Toast显示图文界面——Android开发之路1
Toast的多种使用方法 Toast其实是一个功能特别强大的组件,不仅仅可以吐司一个文本内容,还可以吐司图片以及图文混排的界面.具体用法如下: 第一种:简单的纯文本内容的吐司: Toast.makeT ...
- Mysql - 存储过程/自定义函数
在数据库操作中, 尤其是碰到一些复杂一些的系统, 不可避免的, 会用到函数/自定义函数, 或者存储过程. 实际项目中, 自定义函数和存储过程是越少越好, 因为这个东西多了, 也是一个非常难以维护的地方 ...
- Win10命令提示符(cmd)怎么复制粘贴
在Win10系统里右键开始菜单,选择弹出菜单里的命令提示符,如下图所示: 然后复制要粘贴的文字,例如: echo hovertree.com 把上面的文字复制后,点击命令提示符窗口,然后在命令提示符窗 ...