分页控件的使用
一:下载,并在 vs2010 里面添加 anpnetpager 控件
1: 下载 http://www.webdiyer.com/Controls/AspNetPager/Downloads 下载
2: 将 AspNetPager.dll 和 AspNetPager.xml 考入到项目的 bin 文件夹 并在Bin文件夹上引用AspNetPager。(这一步其实可以用不,执行下面的第三部,就会把第二步执行一次的,不过这个 xml 好像不会自动考进来,所以我们还是把第一步 执行比较好)
3:在VS2010 工具栏上面,右键新建项,然后找到刚才 bin文件的 AspNetPager.dll ,这样在工具栏就可以使用 AspNetPager了,将控件拖到你需要分页的地方,就可以了。
然后就可以在工具栏看到 AspNetPager 控件了
二: 下面开始如何分页的步骤
1:分页控件的准备,我们上面已经做好了
2:在sql2005以及以上,运行分页的存储过程
-- =============================================
-- Author: 牛腩
-- Create date: 2009-07-22 12:41
-- Description: 分页,用到了ROW_NUMBER()
-- =============================================
ALTER
PROCEDURE
[dbo].[proc_FenYe]
@tblName
varchar
(255),
-- 表名
@strGetFields
varchar
(1000) = '
*
',
-- 需要返回的列,默认*
@strOrder
varchar
(255)='
',
-- 排序的字段名,必填
@strOrderType
varchar
(10)='
ASC
',
-- 排序的方式,默认ASC
@PageSize
int
= 10,
-- 页尺寸,默认10
@PageIndex
int
= 1,
-- 页码,默认1
@strWhere
varchar
(1500) = '
'
-- 查询条件 (注意: 不要加 where)
AS
declare
@strSQL
varchar
(5000)
if
@strWhere !='
'
set
@strWhere='
where
'+@strWhere
set
@strSQL=
'
SELECT * FROM (
'+
'
SELECT ROW_NUMBER() OVER (ORDER BY
'+@strOrder+'
'+@strOrderType+'
) AS pos,
'+@strGetFields+'
'+
'
FROM
'+@tblName+'
'+@strWhere+
'
) AS sp WHERE pos BETWEEN
'+str((@PageIndex-1)*@PageSize+1)+'
AND
'+str(@PageIndex*@PageSize)
exec
(@strSQL)
注意:如果用到多表查询,还是使用上面的这个存储过程,下面是在sqlserver 2005 中的查询分析器中调用 上面的存储过程来进行多表查询
//这里是在存储过程里面的调用方法,可以使用多表查询的。
EXEC
[proc_ShowPage]
@tblName = N'
(project p inner join projectca ca on p.caid=ca.id)
',
@strGetFields = N'
p.title,ca.caname
',
@strOrder = N'
p.id
',
@strOrderType = N'
desc
',
@PageSize = 12,
@PageIndex = 1,
@strWhere = N'
'
2:在页面上需要使用分页控件的地方,拉入控件,修改 上一页,下一页,尾页和首页的文字,设置为一直显示。
<webdiyer:AspNetPager ID="
anp
" runat="
server
" AlwaysShow="
True
"
FirstPageText="
首页
" LastPageText="
尾页
" NextPageText="
下一页
" PrevPageText="
上一页
"
CustomInfoHTML="
总计%RecordCount%条记录,共%PageCount%页,每页%PageSize%条
"
ShowCustomInfoSection="
Left
" CssClass="
paginator
"
CurrentPageButtonClass="
cpb
" CustomInfoSectionWidth="
" >
然后设置它的CSS,使用拍拍网的样式
.paginator
{
font
:
11px Arial, Helvetica, sans-serif
;
padding
:
10px 20px 10px 0
;
margin
:
0px
;}
.paginator a
{
padding
:
1px 6px
;
border
:
solid 1px #ddd
;
background
:
#fff
;
text-decoration
:
none
;
margin-right
:
2px
}
.paginator a:visited
{
padding
:
1px 6px
;
border
:
solid 1px #ddd
;
background
:
#fff
;
text-decoration
:
none
;}
.paginator .cpb
{
padding
:
1px 6px
;
font-weight
:
bold
;
font-size
:
13px
;
border
:
none
}
.paginator a:hover
{
color
:
#fff
;
background
:
#ffa501
;
border-color
:
#ffa501
;
text-decoration
:
none
;}
然后给 anp控件加上 属性设置: CssClass=" paginator " CurrentPageButtonClass=" cpb "
3:在分页控件上,双击 进入后台编写分页控件点击的代码(先是统计anp分页控件的所有的产品数,然后是给产品rep绑定)
Niunan.Shop.DAL.
ProductDAO
pro =
new
DAL.
ProductDAO
();
protected void
Page_Load(
object
sender,
EventArgs
e)
{
//页面进入的时候,分页控件先统计总的条数,然后绑定产品
if
(!Page.IsPostBack)
{
anp.RecordCount = pro.ClacCount(getCond());
BindRepPro();
}
}
//绑定产品
private void
BindRepPro()
{
//这里获取产品的时候,是调用分页来调用。分页的个数由 anp.PageSize 控制
repNewPro.DataSource = pro.GetList(
"*"
,
"id"
,
"desc"
, anp.PageSize, anp.CurrentPageIndex, getCond());
repNewPro.DataBind();
}
//获取条件
private string
getCond()
{
string
cond =
"isxp=1"
;
return
cond;
}
//分页控件点击事件(实际上就是重新绑定产品)
protected void
anp_PageChanged(
object
sender,
EventArgs
e)
{
BindRepPro();
}
注释事项:
我们在写一般的存储过程/多表查询的时候,要记得,用 inner join 这个是个好习惯,因为我们一般的存储过程,要转换为 分页的查询的时候,有这个 inner join 就很明显的知道是查询哪几张表
假如我们在 ajax控件里面有用到分页控件,那么如果是 postback提交分页 ,则ajax有效(也就是url不会有动静,但是页面有修改), 如果是 url 分页 ,那么页面的url会跟着改变了,就会变成 page=2 这样。
更加详细的设置,参见下面2篇分页文章
1:牛腩新闻发布系统 http://www.cnblogs.com/1727050508/archive/2012/02/29/2373612.html
2:牛腩购物系统 http://www.cnblogs.com/1727050508/archive/2012/03/05/2379982.html
注意:1使用的分页函数是 只有3个参数的
2:使用的是 6个 参数的(实际存储过程需要7个参数,但是表名我们是手动在下面写了 shop_product)
/// <summary>
分页获取数据列表
///
/// </summary>
/// <param name="strGetFields">
选择的字段
</param>
/// <param name="strOrder">
排序字段
</param>
/// <param name="strOrderType">
排序类型 desc或者asc
</param>
///
///
<param name="PageSize">
页面大小
</param>
/// <param name="PageIndex">
页索引
</param>
/// <param name="strWhere">
条件
</param>
/// <returns></returns>
public
DataSet
GetList(
string
strGetFields,
string
strOrder,
string
strOrderType,
int
PageSize,
int
PageIndex,
string
strWhere)
{
Database
db =
DatabaseFactory
.CreateDatabase();
DbCommand
dbCommand = db.GetStoredProcCommand(
"proc_FenYe"
);
db.AddInParameter(dbCommand,
"tblName"
,
DbType
.AnsiString,
"shop_product"
);
db.AddInParameter(dbCommand,
"strGetFields"
,
DbType
.AnsiString, strGetFields);
db.AddInParameter(dbCommand,
"PageSize"
,
DbType
.Int32, PageSize);
db.AddInParameter(dbCommand,
"PageIndex"
,
DbType
.Int32, PageIndex);
db.AddInParameter(dbCommand,
"strOrder "
,
DbType
.String, strOrder);
db.AddInParameter(dbCommand,
"strOrderType"
,
DbType
.String, strOrderType);
db.AddInParameter(dbCommand,
"strWhere"
,
DbType
.AnsiString, strWhere);
return
db.ExecuteDataSet(dbCommand);
}
/// <summary>
获取总的记录数
///
/// </summary>
/// <param name="strWhere"></param>
/// <returns></returns>
public int
ClacCount(
string
strWhere)
{
string
sql =
"select count(1) from shop_product"
;
if
(!
string
.IsNullOrEmpty(strWhere))
{
sql +=
" where "
+ strWhere;
}
Database
db =
DatabaseFactory
.CreateDatabase();
DbCommand
dbCommand = db.GetSqlStringCommand(sql);
return int
.Parse(db.ExecuteScalar(dbCommand).ToString());
}
3:在牛腩新闻发布系统的时候,使用过一次多表查询分页,但是是3个参数的,以后我们使用的时候,修改成多个参数即可
/// <summary>分页选择新闻
///
/// </summary>
/// <param name="pageSize">页面大小</param>
/// <param name="pageIndex">页索引</param>
/// <param name="cond">条件(不用加where)</param>
/// <returns></returns>
public
DataTable Select(
int
pageSize,
int
pageIndex,
string
cond)
{
//执行分页的存储过程 [proc_FenYe]
DataTable dt =
new
DataTable();
string
procname = "
proc_FenYe
";
SqlParameter[] paras =
new
SqlParameter[]{
new
SqlParameter("
@tblName
","
(news a inner join category b on a.caId=b.id and a.caId=b.id)
"
as
object
),
new
SqlParameter("
@strGetFields
","
a.id,a.title,a.caid,a.createtime,a.content,b.name
"
as
object
),
new
SqlParameter("
@strOrder
","
a.createtime
"
as
object
),
//通过time来排序
new
SqlParameter("
@strOrderType
","
desc
"
as
object
),
new
SqlParameter("
@PageSize
",pageSize
as
object
),
new
SqlParameter("
@PageIndex
",pageIndex
as
object
),
new
SqlParameter("
@strWhere
",cond
as
object
)
};
dt =
new
SQLHelper().ExecuteQuery(procname, paras, CommandType.StoredProcedure);
return
dt;
}

