Repeater分页(转)

Repeater控件的分页方法有几种:

1.使用第三方控件

2.使用.NET提供的一个支持分页的类 PagedDataSource

3.使用DbDataAdapter的一个重载方法DbDataAdapter.Fill(DataSet dataset,int startRecord,int maxRecord,string srcTable).

我个人觉得这些方法都不是很好,用第三方控件容易使人产生惰性,而PagedDataSource和DbDataAdapter重载的方法则效率不是很高,特别是在大数据量的情况下执行的速度更是不可接受.我们应该把分页的任务由数据库来执行,所以这里选择用SQL语句执行分页.

使用SQL语句分页的思想为:用SQL语句查询出当前页码下要显示(且只查出当前页码下要显示)的记录.

下面是具体的aspx.cs:

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
{
static db db1 = new db(); //实例化一个db类
static SqlConnection conn = db1.returnConn(); //获得全局的连接conn

static int pageSize = 10; //每页显示的数量
static int pageCount = returnPageCount(); //页码总数

protected void Page_Load(object sender, EventArgs e)
{
int curPage = 1;
if (Request.QueryString["page"] != null)
{
//判断传入的参数是否为数字
try
{
curPage = Convert.ToInt32(Request.QueryString["page"]);
}
catch
{
curPage = 1;
}
}
bindToList(curPage);
}

//绑定函数
protected void bindToList(int curPage)
{
//先把所有的LinkButton都设置为可用
this.hlFirst.Enabled = true;
this.hlPrev.Enabled = true;
this.hlNext.Enabled = true;
this.hlLast.Enabled = true;
//检查传入的curPage是否合法,并填充当前页的值,以及控制HyperLink的可用
this.hlLast.NavigateUrl = "Default.aspx?page=" + pageCount.ToString();
int nextPage = curPage + 1;
this.hlNext.NavigateUrl = "Default.aspx?page=" + nextPage.ToString();
int prevPage = curPage - 1;
this.hlPrev.NavigateUrl = "Default.aspx?page=" + prevPage.ToString();
if(curPage<=1)
{
curPage=1;
this.hlFirst.Enabled = false;
this.hlPrev.Enabled = false;
}
if (curPage >= pageCount)
{
curPage = pageCount;
this.hlNext.Enabled = false;
this.hlLast.Enabled = false;
}
this.lblCurPage.Text = curPage.ToString();
//实例化查询语句
string sqlStr="";
if(curPage==1)
{
sqlStr ="select top "+pageSize+" * from Users order by userId desc";
}
else
{
sqlStr="select top "+pageSize+" * from Users where userId not in (select top "+pageSize*(curPage-1)+" userId from Users order by userId desc) order by userId desc";
}
//填充并绑定
DataSet ds = db1.returnDataSet(sqlStr,conn);
this.Repeater1.DataSource = ds.Tables[0].DefaultView;
this.Repeater1.DataBind();
//更新当前页的值与页码总数的值
this.lblCurPage.Text = curPage.ToString();
this.lblPageCount.Text = pageCount.ToString();
}


//获得页码总数
protected static int returnPageCount()
{
conn.Open();
SqlCommand cmd = new SqlCommand("select count(*) from Users", conn);
int recordCount = Convert.ToInt32(cmd.ExecuteScalar());
conn.Close();
if (recordCount % pageSize == 0)
{
return recordCount / pageSize;
}
else
{
return recordCount / pageSize + 1;
}
}
}

---------------------------------------------------------------------------------

前台aspx文件的主要代码:

<body>
<form id="form1" runat="server">
<div>
<asp:Repeater ID="Repeater1" runat="server">
<HeaderTemplate>
<table border="0" cellpadding="0" cellspacing="0" width="500px">
<tr style="background:#8800cc">
<td>用户名ID</td>
<td>用户名</td>
<td>用户密码</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("userId") %></td>
<td><a href="http://teer.blog.hexun.com?id=<%# Eval("userId") %>"><%# Eval("userName") %></a></td>
<td><%# Eval("userPassWord") %></td>
</tr>
</ItemTemplate>
<AlternatingItemTemplate>
<tr>
<td><font color="red"><%# Eval("userId") %></font></td>
<td><font color="red"><%# Eval("userName") %></font></td>
<td><font color="red"><%# Eval("userPassWord") %></font></td>
</tr>
</AlternatingItemTemplate>
<SeparatorTemplate>
<tr>
<td colspan="3"><hr /></td>
</tr>
</SeparatorTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
<table width="500" border="0" cellpadding="0" cellspacing="0">
<tr>
<td style="height: 19px; width:90px" align="center">
<asp:HyperLink ID="hlFirst" runat="server" NavigateUrl="~/Default.aspx?page=1">首页</asp:HyperLink></td>
<td style="width: 90px; height: 19px" align="center">
<asp:HyperLink ID="hlPrev" runat="server">上一页</asp:HyperLink></td>
<td style="height: 19px; width:90px" align="center">
<asp:HyperLink ID="hlNext" runat="server">下一页</asp:HyperLink></td>
<td style="height: 19px; width:90px" align="center">
<asp:HyperLink ID="hlLast" runat="server">末页</asp:HyperLink></td>
<td style="height: 19px; width:130px" align="center">
第<asp:Label ID="lblCurPage" runat="server" Text="Label"></asp:Label>/
<asp:Label ID="lblPageCount" runat="server" Text="Label"></asp:Label>页</td>
</tr>
</table>
</div>
</form>
</body>

---------------------------------------------------------------------------------

附加的db.cs类:

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 class db
{
public db()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public SqlConnection returnConn()
{
string connStr = "Data Source=.;Initial Catalog=news;User ID=sa;Password=198235";
SqlConnection conn = new SqlConnection(connStr);
return conn;
}
public DataSet returnDataSet(string sqlStr,SqlConnection conn)
{
DataSet ds = new DataSet();
try
{
SqlDataAdapter adapter = new SqlDataAdapter(sqlStr, conn);
adapter.Fill(ds, "table");
adapter.Fill(
return ds;
}
catch(Exception e)
{
throw (e);
return ds;
}
finally
{
conn.Close();
}
}
PagedDataSource方式分页

ASP.NET中的DataList和Repeater提供了简单快速的方法來显示,其间,我们可以使用<ItemTemplate>更是使我们能随心所欲的控制数据的排放样式!
.可惜的是它们不像Datagrid那样,有内置的分页功能。

如何解决呢?

其实我们可以用【PagedDataSource】 类来解决分页的问题。

PagedDataSource类的属性:


DataSource -数据源

AllowPaging - true 是否允许分页.
PageSize - 每页项目数量
PageCount - 总页数

CurrentPageIndex - 当前所在的页索引
以Repeater为例 代码如下:

==========================================================================

Result.aspx.cs 文件

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace comeday
{
 / <summary>
 / Result 的摘要说明。
 / </summary>
 public class Result : System.Web.UI.Page
 {
  protected System.Web.UI.WebControls.HyperLink lnkPrev;
  protected System.Web.UI.WebControls.HyperLink lnkNext;
  protected System.Web.UI.WebControls.Label lblCurrentPage;
  protected System.Web.UI.WebControls.Label lblTotalPage;
  protected System.Web.UI.WebControls.Repeater Repeater1;
 
  private void Page_Load(object sender, System.EventArgs e)
  {
   数据源
   PagedDataSource Pgds=new PagedDataSource();
       
   Pgds.DataSource=CreateDataSource().DefaultView;
        设置允许分页
   Pgds.AllowPaging=true;
        每页显示为6行
   Pgds.PageSize=6;
        显示总共页数

   lblTotalPage.Text=Pgds.PageCount.ToString();
        当前页
   int CurrentPage;
        请求页码为不为null设置当前页,否则为第一页
   if(Request.QueryString["Page"] != null)
   {
   
    CurrentPage = Convert.ToInt32(Request.QueryString["Page"]);
   }

   else
   {

    CurrentPage = 1;
   }
   当前页所引为页码-1
   Pgds.CurrentPageIndex = CurrentPage - 1;
   显示当前页码
   lblCurrentPage.Text = CurrentPage.ToString();
   如果不是第一页,通过参数Page设置上一页为当前页-1,否则不显示连接
   if(!Pgds.IsFirstPage)
   {
                Request.CurrentExecutionFilePath为当前请求虚拟路径
    lnkPrev.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurrentPage - 1);
   }
        End If
   如果不是最后一页,通过参数Page设置下一页为当前页+1,否则不显示连接
   if(!Pgds.IsLastPage)
   {
    Request.CurrentExecutionFilePath为当前请求虚拟路径
    lnkNext.NavigateUrl = Request.CurrentExecutionFilePath + "?Page=" + Convert.ToString(CurrentPage + 1);
   }
   模板绑定数据源 
   Repeater1.DataSource = Pgds;
   Repeater1.DataBind();

  }
  / <summary>
  / 生成数据源(一个Datatable)
  / </summary>
  / <returns></returns>
public DataTable CreateDataSource()
{
  DataTable dt;
  DataRow dr;
  dt=new DataTable();
 添加列
        dt.Columns.Add(new DataColumn("IntegerValue", System.Type.GetType("System.Int32")));
        dt.Columns.Add(new DataColumn("StringValue", System.Type.GetType("System.String")));
        dt.Columns.Add(new DataColumn("DateTimeValue", System.Type.GetType("System.DateTime")));
        dt.Columns.Add(new DataColumn("BoolValue", System.Type.GetType("System.Boolean")));
 填充数据
 for( int i=0;i<50;i++)
 {
  dr = dt.NewRow();
  dr[0] = i;
  dr[1] = "Item " + i.ToString();
  dr[2] = DateTime.Now.ToShortTimeString();
  if(i%2!=0)
  {
   dr[3] = true;
  }
  else
  {
   dr[3] = false;
  }
  dt.Rows.Add(dr);
 }
 return dt;

}
  #region Web 窗体设计器生成的代码
  override protected void OnInit(EventArgs e)
  {
  
    CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
  
   InitializeComponent();
   base.OnInit(e);
  }
 
  / <summary>
  / 设计器支持所需的方法 - 不要使用代码编辑器修改
  / 此方法的内容。
  / </summary>
  private void InitializeComponent()
  {   
   this.Load += new System.EventHandler(this.Page_Load);

  }
  #endregion
 }
}
===========================================================================

Result.aspx文件

<%@ Page Language="c#" Codebehind="Result.aspx.cs" AutoEventWireup="false" Inherits="comeday.Result" %>
<%@ import Namespace="System.Data" %>
<HTML>
<HEAD>
<title>DataRepeater</title>
<style type="text/css">

BODY
{
 FONT: 10px Verdana, Arial, Helvetica, "sans serif"; COLOR: #000000 }

.txt { FONT-SIZE: 12px }

</style>
</HEAD>
<body>
<form id="Form2" name="form1" method="post" runat="server">
<table class="txt" width="100%" border="0">
     <tbody>
     <tr>
     <td>
     <asp:hyperlink id="lnkPrev" runat="server">上页</asp:hyperlink>
     <asp:hyperlink id="lnkNext" runat="server">下页</asp:hyperlink>第
                   <asp:label id="lblCurrentPage" runat="server"></asp:label>
     页 共
      <asp:label id="lblTotalPage" runat="server"></asp:label>页
                     </td>
     </tr>
     </tbody>
     </table>
     <asp:repeater id="Repeater1" runat="server">
     <ItemTemplate>
     <hr align="left" width="60%" size="1">
     <table class="txt" width="100%" border="0">
       <tr>
       <td>
       Order Date:
       <%# DataBinder.Eval(Container.DataItem, "DateTimeValue", "{0:d}") %>
       </td>
       <tr>
       <td>
       Quantity:
       <%# DataBinder.Eval(Container.DataItem, "IntegerValue", "{0:N2}") %>
       </td>
       <tr>
       <td>
       Item:
       <%# DataBinder.Eval(Container.DataItem, "StringValue") %>
       </td>
       <tr>
       <td>
       Order Date:
       <asp:checkbox id=chk1 checked='<%# DataBinder.Eval(Container.DataItem, "BoolValue") %>' runat="server"/>
       </td>
       </tr>
       </table>
       </ItemTemplate>
       </asp:repeater>
       <hr hight="1">
         </form>
         </body>
         </HTML>

DataList同理。

 

Repeater分页显示最普通的方法
简单的说,先从控件工具箱中拖入两个label(currten page当前页,count page总页),四个linkbuttion(首/下页/上页/尾页)。
无非就是+1 -1 的问题,
------------------------
using System;
using System.Data;
using System.Configuration;
using System.Collections;
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 gonggao : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
this.labPage.Text = "1";
this.contrlRepeater();
}
}
//获取指字符个数的字符
public string cuts(string aa,int bb)
{
if (aa.Length <= bb) { return aa; }
else { return aa.Substring(0, bb); }
}


//Repeater分页控制显示方法
public void contrlRepeater()
{
pb pb1 = new pb();
DataSet ss = new DataSet();
ss = pb1.returnDs("select top 200 [标题],[时间] from news");
PagedDataSource pds = new PagedDataSource();
pds.DataSource = ss.Tables["temptable"].DefaultView;
pds.AllowPaging = true;
pds.PageSize = 2;
pds.CurrentPageIndex = Convert.ToInt32(this.labPage.Text) - 1;
Repeater1.DataSource = pds;
LabCountPage.Text = pds.PageCount.ToString();
labPage.Text = (pds.CurrentPageIndex + 1).ToString();
this.lbtnpritPage.Enabled = true;
this.lbtnFirstPage.Enabled = true;
this.lbtnNextPage.Enabled = true;
this.lbtnDownPage.Enabled = true;
if(pds.CurrentPageIndex<1)
{
this.lbtnpritPage.Enabled = false;
this.lbtnFirstPage.Enabled = false;
}
if (pds.CurrentPageIndex == pds.PageCount-1)
{
this.lbtnNextPage.Enabled = false;
this.lbtnDownPage.Enabled = false;
}
Repeater1.DataBind();
}
protected void lbtnpritPage_Click(object sender, EventArgs e)
{
this.labPage.Text = Convert.ToString(Convert.ToInt32(labPage.Text) - 1);
this.contrlRepeater();
}
protected void lbtnFirstPage_Click(object sender, EventArgs e)
{
this.labPage.Text = "1";
this.contrlRepeater();
}
protected void lbtnDownPage_Click(object sender, EventArgs e)
{
this.labPage.Text =this.LabCountPage.Text;
this.contrlRepeater();
}

protected void lbtnNextPage_Click(object sender, EventArgs e)
{
this.labPage.Text = Convert.ToString(Convert.ToInt32(labPage.Text) + 1);
this.contrlRepeater();
}
}
--------------------------------------------------------
aspx文件:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="gonggao.ascx.cs" Inherits="gonggao" %>
<table>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<tr><td><a href=""><%# cuts(DataBinder.Eval(Container.DataItem,"[标题]").ToString(),8)%></a></td>
<td><a href=""><%# cuts(DataBinder.Eval(Container.DataItem,"[时间]").ToString(),5)%></a></td></tr>
</ItemTemplate>
</asp:Repeater>
</table>
<table border="1"><tr><td align="center">
<asp:LinkButton ID="lbtnFirstPage" runat="server" OnClick="lbtnFirstPage_Click">页首</asp:LinkButton>
<asp:LinkButton ID="lbtnpritPage" runat="server" OnClick="lbtnpritPage_Click">上一页</asp:LinkButton>
<asp:LinkButton ID="lbtnNextPage" runat="server" OnClick="lbtnNextPage_Click">下一页</asp:LinkButton>
<asp:LinkButton ID="lbtnDownPage" runat="server" OnClick="lbtnDownPage_Click">页尾</asp:LinkButton><br />
第<asp:Label ID="labPage" runat="server" Text="Label"></asp:Label>页/共<asp:Label ID="LabCountPage" runat="server" Text="Label"></asp:Label>页 跳至<asp:DropDownList
ID="DropDownList1" runat="server">
</asp:DropDownList>
</td></tr>
</table>


附:pb.returnDs(根据SQL语句返回dataSet数据集.temptable表)
public DataSet returnDs(string sqlStr)
{

DataSet ds = new DataSet();
try
{
//conn.Open();
SqlCommand comm = new SqlCommand(sqlStr, conn);
comm.CommandTimeout = 20;
this.conn.Open();
SqlDataAdapter sda = new SqlDataAdapter(comm);
sda.Fill(ds, "temptable");
return ds;
conn.Close(); conn.Dispose(); comm.Dispose();

}
catch (Exception e)
{
throw (e);
// ds = null;
return ds;
}
finally
{
this.conn.Close();
}

}

 

 

转载于:https://www.cnblogs.com/haik/archive/2010/05/16/1736933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值