ASP.NET Datalist分页

http://hi.baidu.com/wangkunyu0706/blog/item/dd132f95d6ef680c7bf480cb.html

实现DataList或Repeater控件的分页显示有几种方法:
1、写一个方法或存储过程,根据传入的页数返回需要显示的数据表(DataTable)
2、使用PagedDataSource类(位于System.Web.UI.WebControls命名空间里)

本篇文章主要说怎么使用PagedDataSource类实现DataList和Repeater控件的分页显示。DataGrid控件内部也使用了PagedDataSource类,PagedDataSource 类封装 DataGrid 控件的属性,这些属性使 DataGrid 可以执行分页。

PagedDataSource 类的部分公共属性:
AllowCustomPaging 获取或设置指示是否启用自定义分页的值。
AllowPaging 获取或设置指示是否启用分页的值。
Count 获取要从数据源使用的项数。
CurrentPageIndex 获取或设置当前页的索引。
DataSource 获取或设置数据源。
DataSourceCount 获取数据源中的项数。
FirstIndexInPage 获取页中的第一个索引。
IsCustomPagingEnabled 获取一个值,该值指示是否启用自定义分页。
IsFirstPage 获取一个值,该值指示当前页是否是首页。
IsLastPage 获取一个值,该值指示当前页是否是最后一页。
IsPagingEnabled 获取一个值,该值指示是否启用分页。
IsReadOnly 获取一个值,该值指示数据源是否是只读的。
IsSynchronized 获取一个值,该值指示是否同步对数据源的访问(线程安全)。
PageCount 获取显示数据源中的所有项所需要的总页数。
PageSize 获取或设置要在单页上显示的项数。
VirtualCount 获取或设置在使用自定义分页时数据源中的实际项数。

这些属性是否和DataGrid的属性很相似?没错,DataGrid控件就是使用PagedDataSource类来实现数据分页显示的 。下面举个使用PagedDataSource类实现DataList和Repeater控件的分页显示的例子:


public void Page_Load(Object src,EventArgs e)
{
OleDbConnection objConn=new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\test.mdb");
OleDbDataAdapter objCommand=new OleDbDataAdapter("select * from Users",objConn);
DataSet ds=new DataSet();
objCommand.Fill(ds);

//对PagedDataSource 对象的相关属性赋值
PagedDataSource objPds = new PagedDataSource();
objPds.DataSource = ds.Tables[0].DefaultView;
objPds.AllowPaging = true;
objPds.PageSize = 5;
int CurPage;

//当前页面从Page查询参数获取
if (Request.QueryString["Page"] != null)
CurPage=Convert.ToInt32(Request.QueryString["Page"]);
else
CurPage=1;

objPds.CurrentPageIndex = CurPage-1;
lblCurrentPage.Text = "Page: " + CurPage.ToString();

if (!objPds.IsFirstPage)
lnkPrev.NavigateUrl=Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurPage-1);

if (!objPds.IsLastPage)
lnkNext.NavigateUrl=Request.CurrentExecutionFilePath+ "?Page=" + Convert.ToString(CurPage+1);

//把PagedDataSource 对象赋给Repeater控件
Repeater1.DataSource=objPds;
Repeater1.DataBind();
}

众所周知,ASP.Net中给我们提供了三个数据控件--DataGrid,Repeater,DataList。在这三个控件中,DataGrid控件的功能最强大,Repeater控件最忠实于模版原样,DataList控件则兼而有之。
DataGrid控件太有名了,所以以前用的讲的也很多,Repeater功能太少,没有什么好讲的。这里主要是讲一讲DataList控件。
DataList控件其实功能也很强大,他支持选择、编辑,实现的方法也很简单,不过最令人头疼的就是它不像DataGrid控件一样内置了分页的功能,这么好的一个控件竟然不能分页!!!
确实是一个很让人头疼的事情。
不过,只是DataList没有提供内置的分页功能,但是并不表示,我们不能使用DataList控件来实现分页,既然它不给我分页功能,那只好自己动手了。
下面是全部原代码,其实用到的方法和PHP中的分页差不多,只是这里用的是DataAdapter与DataSet组合,而不是PHP中的SQL语句直接搞定。

<% @ Page Language="C#" %>
<% @ Import Namespace="System.Data" %>
<% @ Import Namespace="System.Data.OleDb" %>
<s cript language=C# Runat="Server">

/*
Create By 飞刀
http://www.aspcn.com
2001-7-25 01:44

Support .Net Framework Beta 2
DataList只有一个数据列,可以有多个按钮列
*/


OleDbConnection MyConn;
int PageSize,RecordCount,PageCount,CurrentPage;


public void Page_Load(Object src,EventArgs e)
{
//设定PageSize
PageSize = 3;

//连接语句
string MyConnString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source="+Server.MapPath(".")+"..\\images\\db1.mdb;";
MyConn = new OleDbConnection(MyConnString);
MyConn.Open();

//第一次请求执行
if(!Page.IsPostBack)
{
   ListBind();
   CurrentPage = 0;
   ViewState["PageIndex"] = 0;

   //计算总共有多少记录
   RecordCount = CalculateRecord();
   lblRecordCount.Text = RecordCount.ToString();

   //计算总共有多少页
   PageCount = RecordCount/PageSize;
   lblPageCount.Text = PageCount.ToString();
   ViewState["PageCount"] = PageCount;
}
}


//计算总共有多少条记录
public int CalculateRecord()
{
int intCount;
string strCount = "select count(*) as co from Score";
OleDbCommand MyComm = new OleDbCommand(strCount,MyConn);
OleDbDataReader dr = MyComm.ExecuteReader();
if(dr.Read())
{
   intCount = Int32.Parse(dr["co"].ToString());
}
else
{
   intCount = 0;
}
dr.Close();
return intCount;
}


ICollection CreateSource()
{

int StartIndex;

//设定导入的起终地址
StartIndex = CurrentPage*PageSize;
string strSel = "select * from Score";
DataSet ds = new DataSet();

OleDbDataAdapter MyAdapter = new OleDbDataAdapter(strSel,MyConn);
MyAdapter.Fill(ds,StartIndex,PageSize,"Score");
return ds.Tables["Score"].DefaultView;
}



public void ListBind()
{
score.DataSource = CreateSource();
score.DataBind();

lbnNextPage.Enabled = true;
lbnPrevPage.Enabled = true;
if(CurrentPage==(PageCount-1)) lbnNextPage.Enabled = false;
if(CurrentPage==0) lbnPrevPage.Enabled = false;
lblCurrentPage.Text = (CurrentPage+1).ToString();
}



public void Page_onClick(Object sender,CommandEventArgs e)
{
CurrentPage = (int)ViewState["PageIndex"];
PageCount = (int)ViewState["PageCount"];

string cmd = e.CommandName;
//判断cmd,以判定翻页方向
switch(cmd)
{
   case "next":
    if(CurrentPage<(PageCount-1)) CurrentPage++;
    break;
   case "prev":
    if(CurrentPage>0) CurrentPage--;
    break;
}

ViewState["PageIndex"] = CurrentPage;

ListBind();

}
</s cript>

<FORM id=Form1 runat="server">
共有<asp:Label id=lblRecordCount runat="server" ForeColor="red"></asp:Label>条记录
当前为<asp:Label id=lblCurrentPage runat="server" ForeColor="red"></asp:Label>/<asp:Label id=lblPageCount runat="server" ForeColor="red"></asp:Label>页
<asp:DataList id=score runat="server" EditItemStyle-BackColor="yellow" AlternatingItemStyle-BackColor="Gainsboro" HeaderStyle-BackColor="#aaaadd">
<ITEMTEMPLATE>
<%# DataBinder.Eval(Container.DataItem,"dcid") %><%# DataBinder.Eval(Container.DataItem,"title") %>
<asp:LinkButton id=Linkbutton1 runat="server" CommandName="edit" Text="傻瓜"></asp:LinkButton>
<asp:LinkButton id=btnSelect runat="server" CommandName="edit" Text="编辑"></asp:LinkButton>
</ITEMTEMPLATE>
</asp:DataList>
<asp:LinkButton id=lbnPrevPage runat="server" CommandName="prev" Text="上一页" OnCommand="Page_onClick"></asp:LinkButton>
<asp:LinkButton id=lbnNextPage runat="server" CommandName="next" Text="下一页" OnCommand="Page_onClick"></asp:LinkButton>
</FORM> down_info.asp?id=27881

还有两篇可以鉴戒

Using a Paged Data Source with ASP.NET and C#
http://www.aspnettutorials.com/tutorials/controls/pageddatasource-csharp.aspx

Dynamic Paging For DataList Control with PagedDataSource
http://www.aspdotnetcodes.com/DataList_Dynamic_Paging_PagedDataSource.aspx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值