效果图如下:
<PagerManagerDoc>
<Class name="PagerManager">
<summary>
用于ASP.NET Web应用程序中对数据进行分页的的服务器控件。
</summary>
<remarks>
不同于DataGrid或GridView等带分页功能的数据绑定控件,PagerManager分页控件本身并不显示任何数据,而只显示分页导航元素,数据在页面上的显示方式与该控件无关。PagerManager分页控件可以为GridView、DataGrid、DataList、Repeater以及自定义的数据绑定控件进行分页。PagerManager不仅仅是一个分页控件,它还可以实现如图片浏览等程序中的前一页后一页等导航功能。
<p>PagerManager控件的分页方法和GridView非常相似,但PagerManager的分页功能更为灵活、强大。PagerManager分页控件不仅仅支持默认的PostBack方式分页,它还支持通过Url来实现分页以及Url重写功能,这使得访问者可以直接输入相应的Url来访问任何页面,并且搜索引擎也可以直接检索每个页面,若使用DataGrid或GridView等.net框架自带的数据绑定控件的分页功能,这些是无法实现的。</p><p>
要使用 PagerManager 分页控件,必须最少指定它的 <see cref="RecordCount" /> 属性的值,另外如果需要,指定并编写 <see cref="PageChanging"/> 或 <see cref="PageChanged" /> 事件的处理程序,可以在PageChanging事件处理程序中取消分页事件,在PageChanged事件处理程序中绑定数据或实现自定义的数据呈现逻辑。
<see cref="RecordCount" /> 属性指定要分页的所有数据的总项数,若未指定该值或该值小于等于 <see cref="PageSize" /> ,即要分页的数据只有一页,则PagerManager控件默认会自动隐藏而不显示任何内容,若需在只有一页数据的情况下显示PagerManager分页控件,可以将它的AlwaysShow属性设为true即可。
</p></remarks>
<example>
以下示例说明如何用PagerManager对Repeater进行分页。
<code>
<![CDATA[
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindingData();
}
}
void BindingData()
{
SqlParameter[] SqlParam=new SqlParameter[7];
SqlParam[0] = new SqlParameter("@TableName", "Capacitors");
SqlParam[1] = new SqlParameter("@ReturnFields", "*");
SqlParam[2] = new SqlParameter("@PageSize", PagerManager1.PageSize);
SqlParam[3] = new SqlParameter("@PageIndex", PagerManager1.PageIndex);
SqlParam[4] = new SqlParameter("@Where", SqlSearch);
SqlParam[5] = new SqlParameter("@Orderfld", "PriceNo");
SqlParam[6] = new SqlParameter("@OrderType",2);
using (SqlDataReader dr = SqlHelper.ExecuteReader(Const.ConnectString, CommandType.StoredProcedure, "[dbo].[PagerManager]", SqlParam))
{
if(dr.Read())
{
PagerManager1.RecordCount = Convert.ToInt32(dr[1]);
}
if(dr.NextResult())
{
Repeater1.DataSource = dr;
Repeater1.DataBind();
}
}
}
protected void PagerManager1_PageChanged(object sender, EventArgs e)
{
BindingData();
}
<HTML><HEAD>
<TITLE> PagerManager Samples </TITLE>
</HEAD>
<BODY>
<form runat="server">
<div class="homeheadAT" >
<div class="SearchResult">
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table cellspacing="0" cellpadding="0" border="0">
</HeaderTemplate>
<ItemTemplate>
<tr class="trPicture" >
<td ><img alt="查看详细资料" src="NoImage.bmp" /></td>
<td >
<span>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Name"))) == true ? "" : "<font color=#2965a5>名称:</font>" + Eval("Name") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("SizeCode"))) == true ? "" : "<font color=#2965a5>尺码:</font>" + Eval("SizeCode") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Capacitance"))) == true ? "" : "<font color=#2965a5>电容量:</font>" + Eval("Capacitance") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Tolerance"))) == true ? "" : "<font color=#2965a5>电容误差:</font>" + Eval("Tolerance") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("RatedVoltage"))) == true ? "" : "<font color=#2965a5>额定电压:</font>" + Eval("RatedVoltage") + " "%><br />
</span>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("PriceNo"))) == true ? "" : "<font color=#2965a5>报价编号:</font>" + Eval("PriceNo") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("ProductId"))) == true ? "" : "<font color=#2965a5>产品编号:</font>" + Eval("ProductId") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Brand"))) == true ? "" : "<font color=#2965a5>品牌:</font>" + Eval("Brand") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Series"))) == true ? "" : "<font color=#2965a5>系列:</font>" + Eval("Series") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Length"))) == true ? "" : "<font color=#2965a5>元件长度(L):</font>" + Eval("Length") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Width"))) == true ? "" : "<font color=#2965a5>元件宽度(W):</font>" + Eval("Width") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Thickness"))) == true ? "" : "<font color=#2965a5>元件厚度(T):</font>" + Eval("Thickness") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("LeadSpace"))) == true ? "" : "<font color=#2965a5>引线间距:</font>" + Eval("LeadSpace") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("LeadDia"))) == true ? "" : "<font color=#2965a5>引线直经:</font>" + Eval("LeadDia") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("PinSpacing"))) == true ? "" : "<font color=#2965a5>针距:</font>" + Eval("PinSpacing") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("BodyDia"))) == true ? "" : "<font color=#2965a5>元件直经(D):</font>" + Eval("BodyDia") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Height"))) == true ? "" : "<font color=#2965a5>元件高度(H):</font>" + Eval("Height") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("TemperatureCharacter"))) == true ? "" : "<font color=#2965a5>温度特性:</font>" + Eval("TemperatureCharacter") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("RMSVoltage"))) == true ? "" : "<font color=#2965a5>均方根电压:</font>" + Eval("RMSVoltage") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("ClampingVoltage"))) == true ? "" : "<font color=#2965a5>箝位电压:</font>" + Eval("ClampingVoltage") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("VoltageRiseRate"))) == true ? "" : "<font color=#2965a5>电压上升率:</font>" + Eval("VoltageRiseRate") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("RippleCurrent"))) == true ? "" : "<font color=#2965a5>纹波电流:</font>" + Eval("RippleCurrent") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("LeakageCurrent"))) == true ? "" : "<font color=#2965a5>漏电流:</font>" + Eval("LeakageCurrent") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("ESR"))) == true ? "" : "<font color=#2965a5>等效电阻:</font>" + Eval("ESR") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Impedance"))) == true ? "" : "<font color=#2965a5>阻抗:</font>" + Eval("Impedance") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("UsefulLife"))) == true ? "" : "<font color=#2965a5>使用时间:</font>" + Eval("UsefulLife") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("LoadLife"))) == true ? "" : "<font color=#2965a5>负载时间:</font>" + Eval("LoadLife") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("OperatingTemperature"))) == true ? "" : "<font color=#2965a5>工作温度:</font>" + Eval("OperatingTemperature") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("Termination"))) == true ? "" : "<font color=#2965a5>终端:</font>" + Eval("Termination") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("AdjustmentDirection"))) == true ? "" : "<font color=#2965a5>调整方向:</font>" + Eval("AdjustmentDirection") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("PackingStyle"))) == true ? "" : "<font color=#2965a5>包装方式:</font>" + Eval("PackingStyle") + " "%>
<%# string.IsNullOrEmpty(Convert.ToString(Eval("PackingQuantity"))) == true ? "" : "<font color=#2965a5>包装数量:</font>" + Eval("PackingQuantity") + " "%>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
<center>
<cc1:PagerManager ID="PagerManager1" runat="server" onpagechanged="PagerManager1_PageChanged" ShowInputBox ="Always" SubmitButtonText="Go" Width="80%" PageSize="20"></cc1:PagerManager>
</center>
</div>
</BODY>
</HTML>
]]>
</code><p>该示例所用的Sql Server存储过程代码如下:</p><code>
<![CDATA[
/*********************************************************************************
功能: 分页管理器
测试:
[dbo].[PagerManager] 'Capacitors','*',30,1,'Where RatedVoltage=''50V''' ,'PriceNo',2
[dbo].[PagerManager] 'Capacitors','*',30,301,' Where 1=1 and Brand like ''%日本%''' ,'PriceNo',2
*********************************************************************************/
CREATE PROCEDURE [dbo].[PagerManager]
(
@TableName nvarchar(50), -- 表名
@ReturnFields nvarchar(2000) = '*', -- 需要返回的列
@PageSize int = 10, -- 每页记录数
@PageIndex int = 1, -- 当前页码
@Where nvarchar(2000) = '', -- 查询条件
@Orderfld nvarchar(2000), -- 排序字段名 最好为唯一主键
@OrderType int = 1 -- 排序类型 1:降序 其它为升序
)
AS
DECLARE @TotalRecord int
DECLARE @TotalPage int
DECLARE @CurrentPageSize int
DECLARE @TotalRecordForPageIndex int
DECLARE @OrderBy nvarchar(255)
DECLARE @CutOrderBy nvarchar(255)
if @OrderType = 1
BEGIN
set @OrderBy = ' Order by ' + REPLACE(@Orderfld,',',' desc,') + ' desc '
set @CutOrderBy = ' Order by '+ REPLACE(@Orderfld,',',' asc,') + ' asc '
END
else
BEGIN
set @OrderBy = ' Order by ' + REPLACE(@Orderfld,',',' asc,') + ' asc '
set @CutOrderBy = ' Order by '+ REPLACE(@Orderfld,',',' desc,') + ' desc '
END
-- 记录总数
declare @countSql nvarchar(4000)
set @countSql='SELECT @TotalRecord=Count(*) From '+@TableName+' '+@Where
execute sp_executesql @countSql,N'@TotalRecord int out',@TotalRecord out
SET @TotalPage=(@TotalRecord-1)/@PageSize+1
SET @CurrentPageSize=@PageSize
IF(@TotalPage=@PageIndex)
BEGIN
SET @CurrentPageSize=@TotalRecord%@PageSize
IF(@CurrentPageSize=0)
SET @CurrentPageSize=@PageSize
END
-- 返回总页数和总记录数
SELECT @TotalPage as PageCount,@TotalRecord as RecordCount
-- 返回记录
set @TotalRecordForPageIndex=@PageIndex*@PageSize
exec('SELECT * FROM
(SELECT TOP '+@CurrentPageSize+' * FROM
(SELECT TOP '+@TotalRecordForPageIndex+' '+@ReturnFields+'
FROM '+@TableName+' '+@Where+' '+@OrderBy+') TB2
'+@CutOrderBy+') TB3
'+@OrderBy)
]]>
</code>
</example>
</Class>
</PagerManagerDoc>