当前位置:编程学习 > C#/ASP.NET >>

关于Repeater的分页问题

--------------------编程问答--------------------  现在都是用aspnetpage控件分页的,很简单
除非真的是需要自己写代码分页,不然还是用存储过程加aspnetpage控件分页,方便也效率的 --------------------编程问答-------------------- 使用aspnetpage控件   分页   可以很简单的就实现了
百度可以找找例子 --------------------编程问答-------------------- 给你个俺写的简单repeater分页例子

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    
    <div>
        <table style="border:1px soild #336699;">
            <thead>
                <tr>
                    <th>项目编号</th>
                    <th>项目名称</th>
                    <th>发布时间</th>
                </tr>
            </thead>
            <tbody>
                <asp:Repeater ID="Repeater1" runat="server">
                  <ItemTemplate>
                    <tr>
                        <td><%# Eval("ItemId") %></td>
                        <td><%# Eval("ItemName") %></td>
                        <td><%# Eval("Time") %></td>
                    </tr>
                  </ItemTemplate>
                  <AlternatingItemTemplate>
                    <tr>
                        <td><%# Eval("ItemId") %></td>
                        <td><%# Eval("ItemName") %></td>
                        <td><%# Eval("Time") %></td>
                    </tr>
                  </AlternatingItemTemplate>
                </asp:Repeater>
            </tbody>
        </table>
        <br />
        <webdiyer:AspNetPager ID="AspNetPager1" runat="server" FirstPageText="首页" LastPageText="尾页"
            NextPageText="下一页" PrevPageText="上一页" AlwaysShow="True" OnPageChanging="AspNetPager1_PageChanging">
        </webdiyer:AspNetPager>   
         </div>
    </form>
</body>
</html>



protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bindRepeater1();
        }
    }

    public void bindRepeater1()
    {
        int count = 0;
        DataTable tb = this.getDatable(this.AspNetPager1.CurrentPageIndex, this.AspNetPager1.PageSize, string.Empty,ref count);
        this.Repeater1.DataSource = tb;
        this.Repeater1.DataBind();
        this.AspNetPager1.RecordCount = count;
    }

    public DataTable getDatable(int pageIndex,int pageSize,string filter,ref int Count)
    {
        SqlParameter p = new SqlParameter("@rowCount",SqlDbType.Int);
        p.Direction = ParameterDirection.Output;
        SqlParameter[] param = new SqlParameter[] 
        {
            new SqlParameter("@tblName","Items"),
            new SqlParameter("@strGetFields","ItemId,ItemName,Time"),
            new SqlParameter("@fldName","ItemId"),
            new SqlParameter("@PageSize",pageSize),
            new SqlParameter("@PageIndex",pageIndex),
            new SqlParameter("@OrderType","asc"),
            new SqlParameter("@strWhere",filter),
            p
        };
        DataTable tb = DBHelper.GetTable("pagination", CommandType.StoredProcedure, param);

        Count = Convert.ToInt32(p.Value.ToString());
        return tb;
    }
    protected void AspNetPager1_PageChanging(object src, Wuqi.Webdiyer.PageChangingEventArgs e)
    {
        this.AspNetPager1.CurrentPageIndex = e.NewPageIndex;
        bindRepeater1();
    }


存储过程

create PROCEDURE [dbo].[pagination]
@tblName varchar(255), -- 表名 
@strGetFields varchar(1000), -- 需要返回的列 
@fldName varchar(255), -- 排序的字段名 
@PageSize int, -- 页尺寸 
@PageIndex int, -- 页码 
@OrderType varchar(4), -- 设置排序类型, 非 0 值则降序 
@strWhere varchar(1500), -- 查询条件 (注意: 不要加 where) 
@rowCount int output --查询到的记录数 
AS 

declare @strSQL varchar(5000) -- 主语句 
declare @strTmp varchar(110) -- 临时变量 
declare @strOrder varchar(400) -- 排序类型 
declare @strCountTmp nvarchar(100) --记录数 
declare @timediff datetime --耗时 

begin 
select @timediff = Getdate() 
if @strWhere !='' 
set @strCountTmp = 'select @rowCount = count(*) from [' + @tblName + '] where '+@strWhere 
else 
set @strCountTmp = 'select @rowCount = count(*) from [' + @tblName + ']' 

exec sp_executesql @strCountTmp,N'@rowCount int out',@rowCount out --输出总记录数 

if @OrderType != 'asc' 
begin 
set @strTmp = '<(select min' 
set @strOrder = ' order by ' + @fldName +' desc' 
--如果@OrderType不是0,就执行降序,这句很重要! 
end 

else 
begin 
set @strTmp = '>(select max' 
set @strOrder = ' order by ' + @fldName +' asc' 
end 
if @PageIndex = 1 
begin 
if @strWhere != '' 
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' + @tblName + '] where ' + @strWhere + ' ' + @strOrder 
else 
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from ['+ @tblName + '] '+ @strOrder 
--如果是第一页就执行以上代码,这样会加快执行速度 
end 

else 
begin 
--以下代码赋予了@strSQL以真正执行的SQL代码 
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' 
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '(['+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['+ @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)'+ @strOrder 
if @strWhere != '' 
set @strSQL = 'select top ' + str(@PageSize) +' '+@strGetFields+ ' from [' 
+ @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
+ @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
+ @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' ' 
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder 
end 

end 
exec (@strSQL) 
select datediff(ms,@timediff,GetDate()) as runtime 
--------------------编程问答--------------------
引用 1 楼 linsx1987 的回复:
现在都是用aspnetpage控件分页的,很简单
除非真的是需要自己写代码分页,不然还是用存储过程加aspnetpage控件分页,方便也效率的

楼猪写的太复杂了,看的偶都头大;还是简单点好了.
--------------------编程问答-------------------- 我主要是想用PagedDataSource给Repeater分页。可是总报错。不知问题出在哪里?
执行时不报错,点击下一页和末页时报错,无反应。

提示对话框:Microsoft JScript runtime error: Object doesn't support this property or method

下面是调试时的停顿处,最后到theForm.submit(); 处停止

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
  theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
  if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
  theForm.__EVENTTARGET.value = eventTarget;
  theForm.__EVENTARGUMENT.value = eventArgument;
  theForm.submit(); }
}
//]]>
</script>

--------------------编程问答-------------------- 建议用aspnetpage分页。我有一个datalist分页的程序,手写的代码。给你参考下
前台.aspx:

<asp:DataList ID="DataList4" runat="server" Width="548px">
                                                                <ItemTemplate>
                                                                    <div style="text-align: center">
                                                                        <table border="0" cellpadding="0" cellspacing="0" style="width: 100%">
                                                                            <tr>
                                                                                <td style="width: 40px" align="center">
                                                                                    <asp:Image ID="Image8" runat="server" ImageUrl="~/Images/20.jpg" /></td>
                                                                                <td style="width: 400px" align="left">
                                                                                <a href="viewnews.aspx?id=<%#Eval("id") %>">
                                                                                    <asp:Label ID="Label4" runat="server" Text='<%# Eval("title") %>'></asp:Label>
                                                                                    </a>
                                                                                    </td>
                                                                                <td style="width: 148px">
                                                                                    [<asp:Label ID="Label5" runat="server" Text='<%# Eval("pub_date") %>'></asp:Label>]</td>
                                                                            </tr>
                                                                        </table>
                                                                    </div>
                                                                </ItemTemplate>
                                                            </asp:DataList></td>
                                                    </tr>
                                                     <tr><td style="height:50px" valign="middle" align="center"> 
                                <asp:Label ID="Label9" runat="server" Text="当前页码为:"></asp:Label>[
                                <asp:Label ID="labPage" runat="server" Text="1"></asp:Label>
                                ]
                                <asp:Label ID="Label8" runat="server" Text="总页码为:"></asp:Label>
                                [
                                <asp:Label ID="labBackPage" runat="server"></asp:Label>
                                ]<asp:LinkButton ID="lnkbtnOne" runat="server" Font-Underline="False" ForeColor="Red" OnClick="lnkbtnOne_Click"
                                    >第一页</asp:LinkButton>
                                <asp:LinkButton ID="lnkbtnUp" runat="server" Font-Underline="False" ForeColor="Red" OnClick="lnkbtnUp_Click"
                                    >上一页</asp:LinkButton>
                                <asp:LinkButton ID="lnkbtnNext" runat="server" Font-Underline="False" ForeColor="Red" OnClick="lnkbtnNext_Click"
                                    >下一页</asp:LinkButton>
 <asp:LinkButton ID="lnkbtnBack" runat="server" Font-Underline="False" ForeColor="Red" OnClick="lnkbtnBack_Click"
                                    >最后一页</asp:LinkButton> 
后台.aspx.cs代码:

public void list4()//公司新闻
    {
        OleDbConnection conn = ConnectionDB.getCon();
        OleDbCommand cmd = new OleDbCommand("select  id,title,pub_date from product where pro_name='news' order by id desc ", conn);
        OleDbDataAdapter dsa = new OleDbDataAdapter(cmd);
        DataSet ta = new DataSet();
        dsa.Fill(ta);
        int cutPage = Convert.ToInt32(labPage.Text);//当前显示页页
        PagedDataSource ps = new PagedDataSource();//page数据源
        ps.DataSource = ta.Tables[0].DefaultView;//page数据源的绑定
        ps.AllowPaging = true;//设为能分页
        ps.PageSize = 20;//每页显示的记录数
        ps.CurrentPageIndex = cutPage - 1;//获取当页面
        lnkbtnUp.Enabled = true;
        lnkbtnNext.Enabled = true;
        lnkbtnBack.Enabled = true;
        lnkbtnOne.Enabled = true;

        if (cutPage == 1)
        {
            lnkbtnOne.Enabled = false;//不显示第一页
            lnkbtnUp.Enabled = false;//不显示上一页
        }
        if (cutPage == ps.PageCount)
        {
            lnkbtnNext.Enabled = false;//不显示下一页
            lnkbtnBack.Enabled = false;//不显示最后一页
        }
        labBackPage.Text = Convert.ToString(Convert.ToInt32(ps.PageCount));//总页码数
        DataList4.DataSource = ps;
        DataList4.DataBind();
    }
    protected void lnkbtnOne_Click(object sender, EventArgs e)
    {
        labPage.Text = "1";
        list4();
    }
    protected void lnkbtnUp_Click(object sender, EventArgs e)
    {
        labPage.Text = Convert.ToString(Convert.ToInt32(labPage.Text) - 1);
        list4();
    }
    protected void lnkbtnNext_Click(object sender, EventArgs e)
    {
        labPage.Text = Convert.ToString(Convert.ToInt32(labPage.Text) + 1);
        list4();
    }
    protected void lnkbtnBack_Click(object sender, EventArgs e)
    {
        labPage.Text = labBackPage.Text;
        list4();
    }
--------------------编程问答-------------------- 我用的方法基本和6#的差不多呀,可是就出问题,所以找不到原因? --------------------编程问答-------------------- --------------------编程问答-------------------- 一般直接用的就是微软的分页,不过据说用ajax分页效果最好!
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,