牛腩中用到了分页制作,本文就来介绍一下如何实现该功能。
首先我们先了解一下真假分页的区别:
真分页:确定要显示的数量和内容,然后每次都去数据库取出该少量数据,优点是数据量小,缺点是访问数据库频繁。在大型网站中往往采用真分页。
假分页:从数据库中取出所有的数据,然后分页在界面上显示。访问一次数据库,但由于选择的数据量比较大,所以第一次花费时间比较长,但之后每一页的显示都是直接、快速的,避免对数据库的多次访问。
通过上面的简单介绍我们也可以看出两者之间的区别,假分页在遇到数据量很大的情况下弊端非常明显,真分页可以很好的弥补这一缺陷,下面就介绍一下如何使用AspNetPager控件实现真分页的制作:
先将我们的存储过程写出来,如下:
Create PROCEDURE [dbo].[news_selectByPage]
@startIndex int,
@endIndex int
AS
BEGIN
With temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY id desc)AS Row,* from news
)
SELECT * FROM temptbl where Row between @startIndex and @endIndex
END
GO
接下来就从后往前写,D层代码如下:
#region 选择分页记录
/// <summary>
/// 选择分页记录
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <returns></returns>
public DataTable SelectNewsByPage(int startIndex, int endIndex)
{
DataTable dt = new DataTable();
string sql = "news_selectByPage";
SqlParameter[] paras = new SqlParameter[] {
new SqlParameter("@startIndex",startIndex),
new SqlParameter("@endIndex",endIndex)};
dt = sqlhelper.ExecuteQuery(sql, paras, CommandType.StoredProcedure);
return dt;
}
#endregion
B层:
#region 分页选择记录
/// <summary>
/// 分页选择记录
/// </summary>
/// <param name="startIndex"></param>
/// <param name="endIndex"></param>
/// <returns></returns>
public DataTable SelectNewsByPage(int startIndex,int endIndex)
{
return ndao.SelectNewsByPage(startIndex, endIndex);
}
#endregion
Web:
public partial class newsmanager : System.Web.UI.Page
{
NewsManager nm = new NewsManager();
protected void Page_Load(object sender, EventArgs e)
{
// 判断session里面是否存在管理员
if (Session["admin"] != null && Session["admin"].ToString() == "niunan")
{
// 已登陆
if (!Page.IsPostBack)
{
//设定分页控件总的记录条数(总的记录条数/每页的记录条数Pagesize=页数)
DataTable dt = new DataTable();
dt = nm.SelectAll();
anp.RecordCount = dt.Rows.Count;
BindNews();
}
}
else
{
// 未登陆
Response.Redirect("login.aspx");
}
}
// 删除按钮
protected void lbtnDel_Click(object sender, EventArgs s)
{
string id = ((LinkButton)sender).CommandArgument;
bool b = new NewsManager().Delete(id);
if (b)
{
BindNews();
}
else
{
Page.ClientScript.RegisterStartupScript(Page.GetType(), "message", "<script language='javascript' defer>alert('未知原因导致删除失败!');</script>");
}
}
#region 绑定新闻列表
private void BindNews()
{
int startIndex = anp.StartRecordIndex;
int endIndex = anp.EndRecordIndex;
DataTable dt = nm.SelectNewsByPage(startIndex, endIndex);
repNews.DataSource = dt;
repNews.DataBind();
}
#endregion
protected void anp_PageChanged(object sender, EventArgs e)
{
//Response.Write("开始记录数:" + anp.StartRecordIndex + "<br>结束记录数" + anp.EndRecordIndex);
//当前页切换时,更新绑定的新闻
BindNews();
}
}
<webdiyer:AspNetPager ID="anp" runat="server" UrlPaging="True" AlwaysShow="true"
FirstPageText="首页" LastPageText="末页" OnPageChanged="anp_PageChanged"
NextPageText="下一页" PrevPageText="上一页"
PagingButtonSpacing="0px" NumericButtonCount="5"
CssClass="anpager" CurrentPageButtonClass="cpb" Width="850px" CurrentPageButtonPosition="End" PageSize="5" >
</webdiyer:AspNetPager>
CSS样式:
.anpager {
margin-left: 120px;
}
.anpager .cpb {
background: #1F3A87 none repeat scroll 0 0;
border: 1px solid #CCCCCC;
color: #FFFFFF;
font-weight: bold;
margin: 5px 4px 0 0;
padding: 4px 5px 0;
}
.anpager a {
background: #FFFFFF none repeat scroll 0 0;
border: 1px solid #CCCCCC;
color: #1F3A87;
margin: 5px 4px 0 0;
padding: 4px 5px 0;
text-decoration: none;
}
.anpager a:hover {
background: #1F3A87 none repeat scroll 0 0;
border: 1px solid #1F3A87;
color: #FFFFFF;
margin-left: 20px;
}
内容很基础,需要不断积累。如有错误欢迎指正!