一、AspNetPager7.2分页控件简介
分页是Web应用程序中最常用到的功能之一,在ASP.NET中,虽然自带了一个可以分页的DataGrid(asp.net 1.1)和GridView(asp.net 2.0)控件,但其分页功能并不尽如人意,如可定制性差、无法通过Url实现分页功能等,而且有时候我们需要对DataList和Repeater甚至自定义数据绑定控件进行分页,手工编写分页代码不但技术难度大、任务繁琐而且代码重用率极低,因此分页已成为许多ASP.NET程序员最头疼的问题之一。
AspNetPager针对ASP.NET分页控件的不足,提出了与众不同的解决asp.net中分页问题的方案,即将分页导航功能与数据显示功能完全独立开来,由用户自己控制数据的获取及显示方式,因此可以被灵活地应用于任何需要实现分页导航功能的地方,如为GridView、DataList以及Repeater等数据绑定控件实现分页、呈现自定义的分页数据以及制作图片浏览程序等,因为AspNetPager控件和数据是独立的,因此要分页的数据可以来自任何数据源,如SQL Server、Oracle、Access、mysql、DB2等数据库以及XML文件、内存数据或缓存中的数据、文件系统等等。
AspNetPager 7.2 版发布
新增属性 PagingButtonLayoutType,可设置分页导航元素(数字页索引、上页、下页、首页和尾页)的布局方式,该属性值是一个PagingButtonLayoutType枚举,通过设置该属性为PagingButtonLayoutType.UnorderedList或PagingButtonLayoutType.Span,允许将这些分页导航元素包含在<li>与</li>或<span>与</span>标签之间,以便于为这些分页元素应用CSS样式。
新增 PagingButtonClass 与 PagingButtonStyle 属性,可以单独为分页导航按钮(数字页索引、上页、下页、首页和尾页)设置CSS样式;
新增 FirstLastButtonClass 与 FirstLastButtonStyle 属性,可以单独为首页和尾页分页导航按钮设置CSS样式,如果该属性未设置,但指定了PagingButtonClass 与 PagingButtonStyle 属性的值,则首页和尾页按钮样式将使用 PagingButtonClass 与 PagingButtonStyle 属性中指定的样式;
新增 NextPrevButtonClass 与 NextPrevButtonStyle 属性,可以单独为上页和下页分页导航按钮设置CSS样式,如果该属性未设置,但指定了PagingButtonClass 与 PagingButtonStyle 属性的值,则上页和下页按钮样式将使用 PagingButtonClass 与 PagingButtonStyle 属性中指定的样式;
新增 MoreButtonClass 与 MoreButtonStyle 属性,可以单独为更多页(...)分页导航按钮设置CSS样式,如果该属性未设置,但指定了PagingButtonClass 与 PagingButtonStyle 属性的值,则上页和下页按钮样式将使用 PagingButtonClass 与 PagingButtonStyle 属性中指定的样式;
新增属性 ShowMoreButtons ,可以指定是否显示更多页按钮;
新增属性 CurrentPageButtonPosition ,可设置在每次分页后,当前页数字索引在所有的数字页索引中的显示位置,该属性值是一个PagingButtonPosition枚举,对应的值及说明如下:
Beginning:当前页数字索引总是显示在所有数字页索引的最前面;
End:当前页数字索引总是显示在所有数字页索引的最后面;
Center:当前页数字索引总是显示在所有数字页索引的中间;
Fixed:默认值,固定不变;
控件的CssClass属性仅应用于控件的窗口元素(div),将不再应用于下属分页元素;
废止属性CenterCurrentPageButton,可以用CurrentPageButtonPosition属性取代;
修改CurrentPageIndexn属性,允许在程序中任何地方以编程方式设置CurrentPageIndex的值来动态指定当前页,直接设置该属性的值时将同时引发PageChanging和PageChanged 事件,实现和点击分页按钮一样的分页功能;
修正了7.1版中设置SubmitButtonImageUrl属性后,Postback回发分页方式情况下点击数字页索引按钮不引发分页事件的bug;
修正了使用Url分页时,如果页面上没有服务器端form控件时无法注册客户端脚本的bug,从7.2版起如果使用Url分页并且ShowPageIndexBox属性没有设置为Never时, AspNetPager控件必须放在<form runat="server">与</form>标记之间,若使用Url分页并且ShowPageIndexBox为Never时,页面上可以不使用服务器端form控件。
AspNetPager的主要功能:
1、支持通过Url进行分页:
AspNetPager除提供默认的类似于DataGrid和GridView的PostBack分页方式外,还支持通过Url进行分页,象大多数asp程序中分页一样, Url分页方式允许用户通过在浏览器地址栏中输入相应的地址即可直接进入指定页面,也可以使搜索引擎搜索到所有分页的页面的内容,因此具有用户友好和搜索引擎友好的优点,关于Url分页与PostBack分页方式的差异,请参考Url与PostBack分页方式的对比。
2、支持Url分页方式下的Url重写(UrlRewrite)功能
Url重写技术可以使显示给用户的Url不同于实际的Url,Url重写技术被广泛应用于搜索引擎优化(SEO)、网站重组后重定向页面路径以及提供用户友好的Url等方面, AspNetPager支持Url重写技术使您可以自定义分页导航的Url格式,实现Url重写;
3、支持使用用户自定义图片做为导航元素:
您可以使用自定义的图片文件做为分页控件的导航元素,而不仅仅限于显示文字内容。
4、功能强大灵活、使用方便、可定制性强:
AspNetPager分页控件的所有导航元素都可以由用户进行单独控制,从6.0版起,AspNetPager支持使用主题(Theme)与皮肤(Skin)统一控件的整体样式,配合asp.net 2.0中的DataSource控件,AspNetPager只需要编写短短几行代码,甚至无需编写任何代码,只需设置几个属性就可以实现分页功能。
5、增强的 Visual Studio 2005/2008设计时支持
增强的设计时支持使控件在设计时更加直观,易于使用,开发快捷方便。
6、兼容IE6.0+及FireFox 1.5+等浏览器
7、丰富而完整的控件文档和示例项目:
控件附带的完整的帮助文档及示例项目能够帮助您快速上手,熟悉AspNetPager控件的使用,您还可以通过给作者留言以及论坛提问等方式解决控件使用中遇到的问题。
AspNetPager72Src下为AspNetPager组件源码
二、使用AspNetPager7.2分页控件的准备工作
1、下载AspNetPager7.2分页控件(百度一下)
2、将Bin文件夹下的AspNetPager.dll和AspNetPager.XML拷贝至站点文件夹下的Bin文件夹中
如果站点中无Bin文件夹,可在站点中点击右键-添加ASP.NET文件夹
3、在VS2005工具箱中“常规”选项卡中点右键选择“选择项…”
点击“浏览…”,找到站点中的AspNetPager.dll后确定,
工具箱中常规中出现了
4、使用分页功能时,将AspNetPager分页控件拖曳至相应页面,编码即可。
三、分页控件示例
1、在站点中添加App_Code的文件夹,如下图:
2、将SqlHelper.cs文件加入至App_Code的文件夹
使用已有方法:
///<summary>
///执行一条返回第一条记录第一列的SqlCommand命令,通过已经存在的数据库连接。
///使用参数数组提供参数
///</summary>
///<remarks>
///使用示例:
/// Object obj = ExecuteScalar(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
///</remarks>
///<param name="conn">一个已经存在的数据库连接</param>
///<param name="commandType">SqlCommand命令类型 (存储过程, T-SQL语句,等等。)</param>
///<param name="commandText">存储过程的名字或者 T-SQL 语句</param>
///<param name="commandParameters">以数组形式提供SqlCommand命令中用到的参数列表</param>
///<returns>返回一个object类型的数据,可以通过 Convert.To{Type}方法转换类型</returns>
public static object ExecuteScalar(SqlConnection connection, CommandType cmdType, string cmdText, params SqlParameter[] commandParameters)
{
SqlCommand cmd = new SqlCommand();
PrepareCommand(cmd, connection, null, cmdType, cmdText, commandParameters);
object val = cmd.ExecuteScalar();
cmd.Parameters.Clear();
return val;
}
加入分页方法:
//分页
///<summary>
/// AspNetPager分页
/// clg
/// 2009.4
///</summary>
///<param name="conn">已存在连接对象</param>
///<param name="sqlStr">执行查询语句</param>
///<param name="pageIndex">当前页码</param>
///<param name="pageSize">每页记录条数</param>
///<param name="outtable">输出表名</param>
///<returns></returns>
public static DataSet GetCurrentPage(SqlConnection conn,string sqlStr, int pageIndex, int pageSize,string outtable)
{
//设置导入的起始地址
int firstPage = pageIndex * pageSize;
DataSet dataset = new DataSet();
SqlDataAdapter dataAdapter = new SqlDataAdapter(sqlStr,conn);
dataAdapter.Fill(dataset, firstPage, pageSize, outtable);
conn.Close();
dataAdapter.Dispose();
return dataset;
}
3、Web.config中修改连库字符串,注意这里使用的是<connectionStrings>
<connectionStrings>
<addname="pubsConnectionString"connectionString="data source=(local);uid=sa;pwd=sa;database=ASPNETTHREE"providerName="System.Data.SqlClient"/>
</connectionStrings>
4、前台显示页代码RepList.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="RepList.aspx.cs" Inherits="RepList" %>
<%@ Register Assembly="AspNetPager" Namespace="Wuqi.Webdiyer" TagPrefix="webdiyer" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>用AspNetPager.dll控件的分页方法操作方法</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table border=1>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr><td>
<a href='shownews.aspx?id=<%# Eval("id") %>'><%# Eval("title") %>></a> <%# Eval("AddTime","{0:d}")%>
</td></tr>
</ItemTemplate>
</asp:Repeater>
</table>
<webdiyer:AspNetPager ID="AspNetPager1" runat="server" Width="100%" NumericButtonCount="6" UrlPaging="true" NumericButtonTextFormatString="[{0}]" CustomInfoHTML=" 第 <font color='red'><b>%CurrentPageIndex%</b></font> 页 共 %PageCount% 页 显示 %StartRecordIndex%-%EndRecordIndex% 条" ShowCustomInfoSection="left"
FirstPageText="首页" LastPageText="末页" NextPageText="下页" PrevPageText="上页" Font-Names="Arial" BackColor="#F8B500" AlwaysShow="true" ShowInputBox="Always" SubmitButtonText="跳转" SubmitButtonStyle="botton" OnPageChanged="AspNetPager1_PageChanged" >
</webdiyer:AspNetPager>
</div>
</form>
</body>
</html>
5、RepList.aspx.cs页面的代码
protected void Page_Load(object sender, EventArgs e)
{
if (Request.QueryString["ClassID"] != null)
{
if (!IsPostBack)
{
Bind();
}
}
else
{
Response.Write("<script language=javascript>alert('分类ID不存在!');location.href='index.aspx'</script>");
}
}
private void Bind()
{
SqlConnection conn = new SqlConnection(SqlHelper.ConnectionStringLocalTransaction);
string sqlcount = "select count(*) from News where ClassID=" + Request.QueryString["ClassID"];
AspNetPager1.RecordCount = int.Parse(SqlHelper.ExecuteScalar(conn, CommandType.Text, sqlcount, null).ToString());
int pageIndex = AspNetPager1.CurrentPageIndex - 1;
int pageSize = AspNetPager1.PageSize = 2;
string sqlstr = "select * from News where ClassID="+Request.QueryString["ClassID"];
Repeater1.DataSource=SqlHelper.GetCurrentPage(conn,sqlstr,pageIndex,pageSize,"news");
Repeater1.DataBind();
}
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
if (Request.QueryString["ClassID"] != null)
{
Bind();
}
}