前一篇文章是采用存储过程来进行分页的,但是存在缺陷,没有代码重用,针对不同的表或者不同的视图都需要去编写存储过程,这样很麻烦,代码的重用性很差。本文将通过一个用户控件来实现数据分页的页面层以达到代码重用的目的。
分页是借助用户自定义控件来实现,在这里主要有以下两种方法来实现:
(一).吴旗娃的AspNetPager组件(推荐使用)
首先,下载该dll文件。下载地址:AspNetPager分页控件
在工具箱中,鼠标右键,“选择项”,添加刚下载的dll文件。
然后,将会在工具箱中看到一个AspNetPager分页控件,拖到页面,再拖一个数据显示控件,Gridview或Repeater。
最后,写后台代码如下:
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
BindData();
}
}
//获取并绑定数据
public void BindData()
{
//连接数据库
string strCon = "server=.;database=Northwind;uid=sa;pwd=";
SqlConnection con = new SqlConnection(strCon);
string sql = "select * from Customers";
SqlDataAdapter sda = new SqlDataAdapter(sql,con);
DataSet ds = new DataSet();
sda.Fill(ds);
//AspNetPager分页控件如何用
DataView dv = ds.Tables[0].DefaultView;
//使用PagedDataSource类
PagedDataSource pds = new PagedDataSource();
AspNetPager1.RecordCount = dv.Count;//取得记录总数
pds.DataSource = dv;
pds.AllowPaging = true;
//取得当前页的索引
pds.CurrentPageIndex = AspNetPager1.CurrentPageIndex - 1;
pds.PageSize = AspNetPager1.PageSize;//取得每页显示的记录数
GridView1.DataSource = pds; //指定数据源
GridView1.DataBind();
}
protected void AspNetPager1_PageChanged(object sender, EventArgs e)
{
BindData();
}
}
就这么简单几步就OK啦,那么我们如何为AspNetPager分页控件定义及应用样式。很简单,如下
在源中的<style type="text/css"></style>中添加下列样式,再在AspNetPager分页控件后面添加属性即可。
(1).网易风格:
CSS样式:
.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;}
属性设置:CssClass="anpager" CurrentPageButtonClass="cpb"
(2).拍拍网风格:
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;}
属性设置:CssClass="paginator" CurrentPageButtonClass="cpb"
(3).迅雷风格:
CSS样式:
.pages { color: #999; }
.pages a, .pages .cpb { text-decoration:none;float: left; padding: 0 5px; border: 1px solid #ddd;background: #ffff;margin:0 2px; font-size:11px; color:#000;}
.pages a:hover { background-color: #E61636; color:#fff;border:1px solid #E61636; text-decoration:none;}
.pages .cpb { font-weight: bold; color: #fff; background: #E61636; border:1px solid #E61636;}
属性设置:CssClass="pages" CurrentPageButtonClass="cpb"
(二).张子阳的Asp.Net 可扩展分页用户控件
此用法实现起来比较复杂,没有上面的简单,它采用的控件思想是:
它是基于Http的Request请求,获取Url参数进行分页的;而不是集于Http的Post请求,获取隐藏的表单数据项来进行分页的。
感兴趣的朋友可以参考:http://www.tracefact.net/asp-net/Extensible-Paging-User-Control.aspx
总结如下,第一种控件是采用PostBack分页的,第二种控件是采用URL分页的,两者各有千秋,但是
AspNetPager除提供默认的类似于DataGrid和GridView的PostBack分页方式外,还支持通过Url进行分页,象大多数asp程序中分页一样, Url分页方式允许用户通过在浏览器地址栏中输入相应的地址即可直接进入指定页面,也可以使搜索引擎搜索到所有分页的页面的内容,因此具有用户友好和搜索引擎友好的优点,关于Url分页与PostBack分页方式的差异,请参照下表:
PostBack分页与Url分页比较 | ||
PostBack分页 | Url分页 | |
分页方式 | 通过页面回发来传递分页信息。 | 通过跳转到指定的Url来传递分页信息。 |
分页性能 | 可以将所有分页信息保存在ViewState中,如在页面初次加载时获取要分页的记录的总数,其后无需再次访问数据库获取该值,而可以从回发后的ViewState中获取,减少了数据库访问次数,提高了分页的速度。 | 每次分页时页面都被重新初始化,除通过Url传递的当前页索引外所有分页的数据都得重新获取,如每次分页都得从数据库获取所有要分页的记录的总数,因此速度较PostBack分页方式稍差,但可以通过将记录总数保存在Cache或Session中来达到与PostBack分页一样的分页性能。 |
灵活性 | 访问者可以动态改变分页属性,回发后仍可以保持改变后的属性值。 | 可以动态改变属性,但页面跳转后不会保留改变的属性值,而恢复为初始值。 |
直接访问 | 访问者无法通过输入Url访问除第一页外的其它页面。 | 访问者可以通过输入相应页面的Url访问任一页。 |
搜索引擎友好 | 搜索引擎只能检索第一页。 | 搜索引擎可以检索所有页。 |
来源:http://www.360doc.com/content/10/0916/17/1930353_54159722.shtml