Asp.Net真分页技术
最近学校要做课题,闲来没事研究了下Asp.net的分页,我使用Repeater进行数据的绑定,每次从数据库读取到8条数据填充到Repeater中,这样搞可以降低数据库的压力,提高效率.
效果图如下:
数据库设计如下:
附加一下代码:
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<link rel="stylesheet" href="layui.css" />
<link rel="stylesheet" href="bootstrap.css" />
<style type="text/css">
.pages {
color: #999;
overflow: auto;
}
.pages a, .pages .cpb {
text-decoration: none;
float: left;
padding: 0 5px;
border: 1px solid #ddd;
background: #ffff;
margin: 0 2px;
font-size: 17px;
color: #000;
}
.pages a:hover {
background-color: #347AB6;
color: #fff;
border: 1px solid #347AB6;
text-decoration: none;
}
.pages .cpb {
font-size:large;
font-weight: bold;
color: #fff;
background: #347AB6;
border: 1px solid #347AB6;
}
</style>
</head>
<body>
<form id="form1" runat="server">
<div style="width:500px;top:100px;">
<asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand" OnItemDataBound="Repeater1_ItemDataBound">
<HeaderTemplate>
<table class="layui-table">
<thead>
<tr>
<th>产品ID</th>
<th>产品</th>
<th>季度</th>
<th>销售量</th>
<th>操作</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<asp:Panel ID="plItem" runat="server">
<tr>
<td>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("TableID") %>'></asp:Label>
</td>
<td>
<asp:Label ID="Label2" runat="server" Text='<%# Bind("TableName") %>'></asp:Label>
</td>
<td>
<asp:Label ID="Label3" runat="server" Text='<%# Bind("Tablejidu") %>'></asp:Label>
</td>
<td>
<asp:Label ID="Label4" runat="server" Text='<%# Bind("TableNumber") %>'></asp:Label>
</td>
<td>
<asp:LinkButton ID="lbtEdit" class="layui-btn layui-btn-xs" CommandName="Edit" CommandArgument='<%#Eval("TableID") %>' runat="server">编辑</asp:LinkButton>
<asp:LinkButton ID="lbtDelete" class="layui-btn layui-btn-danger layui-btn-xs" CommandName="Delete" CommandArgument='<%#Eval("TableID") %>' runat="server">删除</asp:LinkButton>
</td>
</tr>
</asp:Panel>
<asp:Panel ID="plEdit" runat="server">
<tr>
<td>
<asp:Label ID="Label5" runat="server" Text='<%# Bind("TableID") %>'></asp:Label>
</td>
<td>
<asp:TextBox ID="txtTableName" runat="server" Text='<%#Eval("TableName") %>'></asp:TextBox>
</td>
<td>
<asp:TextBox ID="txtTablejidu" runat="server" Text='<%#Eval("Tablejidu") %>'></asp:TextBox>
</td>
<td>
<asp:TextBox ID="txtTableNumber" runat="server" Text='<%#Eval("TableNumber") %>'></asp:TextBox>
</td>
<td>
<asp:LinkButton ID="lbtCancel" class="layui-btn layui-btn-xs" CommandName="Cancel" CommandArgument='<%#Eval("TableID") %>' runat="server">取消</asp:LinkButton>
<asp:LinkButton ID="lbtUpdate" class="layui-btn layui-btn-xs" CommandName="Update" CommandArgument='<%#Eval("TableID") %>' runat="server">更新</asp:LinkButton>
</td>
</tr>
</asp:Panel>
</ItemTemplate>
<FooterTemplate>
</tbody></table>
</FooterTemplate>
</asp:Repeater>
<fieldset class="layui-elem-field layui-field-title" style="margin-top: 30px;text-align:center">
<legend>
<webdiyer:AspNetPager ID="AspNetPager1" runat="server"
CssClass="pages" CurrentPageButtonClass="cpb" PagingButtonSpacing="0" FirstPageText="首页"
LastPageText="尾页" NextPageText="后页" PrevPageText="前页" AlwaysShow="True"
NumericButtonCount="3" PageSize="5"
OnPageChanging="AspNetPager1_PageChanging1">
</webdiyer:AspNetPager>
</legend>
</fieldset>
</div>
</form>
</body>
</html>
后台代码:
string strconn = System.Configuration.ConfigurationManager.ConnectionStrings["Mydb"].ToString();
private int id = 0; //保存指定行操作所在的ID号
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
SqlConnection conn = new SqlConnection(strconn);
conn.Open();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "select count(*) from Tables";
AspNetPager1.AlwaysShow = true;
AspNetPager1.PageSize = 5;
AspNetPager1.RecordCount = (int)cmd.ExecuteScalar();
conn.Close();
this.DataBindToRepeater(0);//将数据绑定到Repeater控件上
}
}
private void DataBindToRepeater(int pageindex)
{
//使用using语句进行数据库连接
using (SqlConnection sqlCon = new SqlConnection(strconn))
{
sqlCon.Open(); //打开数据库连接
SqlCommand sqlcom = new SqlCommand(); //创建数据库命令对象
sqlcom.CommandText = "select * from(select ID as TableID,产品 as TableName,季度 as Tablejidu,销售量 as TableNumber from Tables)AS temp order by TableID offset "+pageindex*5+" rows fetch next 5 rows only"; //为命令对象指定执行语句
sqlcom.Connection = sqlCon; //为命令对象指定连接对象
this.Repeater1.DataSource = sqlcom.ExecuteReader(); //为Repeater对象指定数据源
this.Repeater1.DataBind(); //绑定数据源
}
}
protected void Repeater1_ItemCommand(object source, RepeaterCommandEventArgs e)
{
//获取命令文本,判断发出的命令为何种类型,根据命令类型调用事件
if (e.CommandName == "Edit") //编辑命令
{
id = int.Parse(e.CommandArgument.ToString()); //获取命令ID号
}
else if (e.CommandName == "Cancel") //取消更新命令
{
id = -1;
}
else if (e.CommandName == "Delete") //删除行内容命令
{
id = int.Parse(e.CommandArgument.ToString()); //获取删除行的ID号
//删除选定的行,并重新指定绑定操作
this.DeleteRepeater(id);
}
else if (e.CommandName == "Update") //更新行内容命令
{
//获取更新行的内容和ID号
string strText = ((TextBox)e.Item.FindControl("txtTableName")).Text.Trim();
string jidu = ((TextBox)e.Item.FindControl("txtTablejidu")).Text.Trim();
string xiaoshou = ((TextBox)e.Item.FindControl("txtTableNumber")).Text.Trim();
int intId = int.Parse(((Label)e.Item.FindControl("Label5")).Text);
//更新Repeater控件的内容
this.UpdateRepeater(strText, intId,jidu,xiaoshou);
}
//重新绑定控件上的内容
this.DataBindToRepeater(0);
}
private void DeleteRepeater(int intId)
{
using (SqlConnection sqlCon = new SqlConnection(strconn))
{
sqlCon.Open(); //打开数据库连接
SqlCommand sqlcom = new SqlCommand(); //创建数据库命令对象
sqlcom.CommandText = "delete from Tables where id=@id"; //为命令对象指定执行语句
sqlcom.Connection = sqlCon; //为命令对象指定连接对象
//创建参数集合,并向sqlcom中添加参数集合
SqlParameter sqlParam = new SqlParameter("@id", intId);
sqlcom.Parameters.Add(sqlParam);
sqlcom.ExecuteNonQuery(); //指定更新语句
}
}
private void UpdateRepeater(string txtTableName, int intId,string jidu,string xiaoshou)
{
using (SqlConnection sqlCon = new SqlConnection(strconn))
{
sqlCon.Open(); //打开数据库连接
SqlCommand sqlcom = new SqlCommand(); //创建数据库命令对象
sqlcom.CommandText = "update Tables set 产品=@str,季度=@jidu,销售量=@xiaoshou where id=@id"; //为命令对象指定执行语句
sqlcom.Connection = sqlCon; //为命令对象指定连接对象
//创建参数集合,并向sqlcom中添加参数集合
SqlParameter[] sqlParam = {
new SqlParameter("@str", txtTableName),
new SqlParameter("@id", intId),
new SqlParameter("@jidu",jidu),
new SqlParameter("@xiaoshou",xiaoshou)
};
sqlcom.Parameters.AddRange(sqlParam);
sqlcom.ExecuteNonQuery(); //指定更新语句
}
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//判断Repeater控件中的数据是否是绑定的数据源,如果是的话将会验证是否进行了编辑操作
//ListItemType 枚举表示在一个列表控件可以包括,例如 DataGrid、 DataList和 Repeater 控件的不同项目。
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
{
//获取绑定的数据源,这里要注意上面使用sqlReader的方法来绑定数据源,所以下面使用的DbDataRecord方法获取的
//如果绑定数据源是DataTable类型的使用下面的语句就会报错.
System.Data.Common.DbDataRecord record = (System.Data.Common.DbDataRecord)e.Item.DataItem;
//DataTable类型的数据源验证方式
//System.Data.DataRowView record = (DataRowView)e.Item.DataItem;
//判断数据源的id是否等于现在的id,如果相等的话证明现点击了编辑触发了userRepeat_ItemCommand事件
if (id == int.Parse(record["TableID"].ToString()))
{
((Panel)e.Item.FindControl("plItem")).Visible = false;
((Panel)e.Item.FindControl("plEdit")).Visible = true;
}
else
{
((Panel)e.Item.FindControl("plItem")).Visible = true;
((Panel)e.Item.FindControl("plEdit")).Visible = false;
}
}
}
protected void AspNetPager1_PageChanging1(object src, PageChangingEventArgs e)
{
AspNetPager1.CurrentPageIndex = e.NewPageIndex;
DataBindToRepeater(e.NewPageIndex-1);
}
}
}
完成!!!
Asp.Net真分页技术的更多相关文章
- ASP.NET真分页_接前篇引用AspNetPager.dll进行数据分页
一.前端准备工作 1.之前我写到过<Asp.net中引用AspNetPager.dll进行数据分页> 这种分页方式只能在前台将数据分页,而每次点击查询时对目标数据库还是全查询,这样不仅会 ...
- ASP.NET真假分页—真分页
当数据量过大,有几万甚至十几万条数据时,每次都从数据库中取出所有数据就会降低查询效率,系统运行慢,还有可能卡死,这时假分页就会显得很不人性化,因此有了真分页的必要性. 正如上篇博文总结归纳,“真”相对 ...
- ASP.NET(五):ASP.net实现真分页显示数据
导读:在上篇文章中,介绍了用假分页实现数据的分页显示 ,而避免了去拖动滚动条.但,假分页在分页的同时,其实是拖垮了查询效率的.每一次分页都得重新查询一遍数据,那么有没有方法可以同时兼顾效率和分页呢,那 ...
- [小技巧]让你的GridView支持IQueryable,并自动实现真分页
众所周知,asp.net自带的GridView在自带分页方面设计得很2,因为它是假分页,即内存分页.而且它不智能支持强大的Iqueryable. 但这表明微软忽略了现实中的分页需求吗?答案应该不是,我 ...
- 分页技术之GridView控件
GridView控件实现分页技术 第一步:设置GridView控件的属性,跟分页相关的属性设置如下: AllowPaging="true":允许分页, PageSize=" ...
- Jsp分页实例---真分页
网页的分页功能的实现比较简单,实现方法也多种多样. 今天总结一个简单的Jsp真分页实例. 首先,提到分页就要先明确一个概念,何为真分页何谓假分页. 假分页:一次性从数据库读出表的所有数据一次性的返回给 ...
- 关于Ajax无刷新分页技术的一些研究 c#
关于Ajax无刷新分页技术的一些研究 c# 小弟新手,求大神有更好的解决方案,指教下~ 以前做项目,用过GridView的刷新分页,也用过EasyUI的封装好的分页技术,最近在老项目的基础上加新功能, ...
- Ajax+存储过程真分页实例解析(10W数据毫秒级+项目解析)
周末闲来无事,突然想写个分页的东西玩玩,说走就走 在文章最后我会把整个项目+数据库附上,下载下来直接运行就可以看效果了.整个项目采用的是简单三层模式,开发平开是VS2010+SQL2012 一.我要做 ...
- 网站真分页js代码该怎么写?
真分页这个词对程序猿们来说,并不是一个陌生的词汇,但是如果你是初次学习真分页,或许还是得花点时间小小研究下,下面是之前去转盘网(喜欢的可以看看,也可以进入引擎模式)的真分页js部分代码,html部分的 ...
随机推荐
- PHP+Swoole 作为网络通信框架
PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列, ...
- CAD制图初学入门教程:怎么在CAD中绘制箭头
在接触CAD的时候大家有没有和小编一样感觉无所适从,所以下面就来和大家分享一个CAD制图初学入门教程,在CAD中绘制箭头.在CAD图形上进行标注内容的时候一般都会使用箭头来进行指示,那具体怎么在CAD ...
- django7-cookie与session
1.有状态服务与无状态服务 服务实例存储了客户端的数据 ,那么这就是个有状态服务 服务实例不存储客户端数据 ,让其他缓存存储客户端数据 ,这就是无状态服务 ,http就是无状态的 2.什么是cooki ...
- if语句,if...else语句的分析
if语句的反汇编判断 if语句的反汇编判断基本是围绕JCC指令的,如果想要有深刻的理解,可以自行练习JCC指令 执行各类影响标志位的指令 jxx xxxx 1.案例一 mov eax,dword pt ...
- Fundebug微信小程序BUG监控服务支持Source Map
摘要: 自动还原真实出错位置,快速修复BUG. Source Map功能 微信小程序的Source Map功能目前只在 iOS 6.7.2 及以上版本支持. 微信小程序在打包时,会将所有 js 代码打 ...
- crawlscrapy简单使用方法
crawlscrapy简单使用方法 1.创建项目:scrapy startproject 项目名例如:scrapy startproject wxapp windows下,cmd进入项目路径例如d:\ ...
- Linux中的硬链接和软链接的概念、区别及用法
概念: 硬链接(hard link): A是B的硬链接(A和B都是文件名),则A的目录项中的inode节点号与B的目录项中的inode节点号相同,即一个inode节点对应两个不同的文件名,两个文件名指 ...
- [Go] gocron源码阅读-go语言web框架Macaron
gocron源码中使用的是马卡龙框架,下面这个就是安装这个框架,和一般的MVC框架很像go get gopkg.in/macaron.v1git clone https://github.com/go ...
- [Go] gocron源码阅读-通过第三方cli包实现命令行参数获取和管理
gocron源码中使用的是下面这个第三方包来实现的,下面就单独的拿出来测试以下效果,和官方flag包差不多 go get github.com/urfave/cli package main impo ...
- [PHP] 基于redis的分布式锁防止高并发重复请求
需求:我们先举个某系统验证的列子:(A渠道系统,业务B系统,外部厂商C系统) (1)B业务系统调用A渠道系统,验证传入的手机.身份证.姓名三要素是否一致. (2)A渠道系统再调用外部厂商C系统. (3 ...