65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Repeater 控件进行分页

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.08/5 (8投票s)

2008年12月16日

CPOL

2分钟阅读

viewsIcon

121802

downloadIcon

1881

使用Repeater控件分页 / 在 C# ASP.NET 2.0 中使用数据控件进行自定义分页

引言

绑定Repeater控件是一个简单的任务,但在Repeater控件上进行分页或在任何数据控件上进行自定义分页却有些困难。本文演示了如何为任何数据控件进行自定义分页,或使用Repeater控件进行分页,以及如何绑定Repeater控件。

ASP.NET 2.0 提供了五种数据控件,其中 Repeater 控件是快速绑定的数据控件。然而,该控件没有内置分页。这意味着,不分页地绑定大量记录不是一个好的编程概念,因为它会在单个页面上显示所有数据,并且页面大小会变得太长。因此,解决方案是自定义分页,如果未提供内置分页。

机制

对于自定义分页,我使用了数据逻辑 (DL) 支持,并根据 DL 部分中的便利性动态转换了表,以便我们的应用程序可以快速运行。存储过程“sp_StudentRec”接受两个输入参数,即 @pag,用户在当前页面,@pgSize,您要显示的条目数。它返回两个表:第一个包含条目,第二个用于表中存在的记录总数。从该表中,我们可以计算 UI 上可能的页面数。

CREATE PROCEDURE sp_StudentRec  
( 
@pg int, 
@pgSize int 
) 
AS 
BEGIN 
Create table #temp 
( 
id int identity primary key, 
StName varchar(50), 
StRoll varchar(5), 
StPercent real 
) 
 
 
Set NoCount OFF 
Insert into #temp(StName, StRoll, StPercent) Select * from Tbl_Student order by AggMarks 
 
 
declare @from int 
declare @to int 
set @to=@pg * @pgSize 
Set @from= @pg * @pgSize-@pgsize 
 
Select * from #temp where id>@from and id<=@to 
Select count(*) from #temp
drop table #temp 
Set NoCount ON 
END
image001.jpg
图 1 表的结构

图 1 显示了表的结构。请确保您的数据库包含 SP 中使用的表,字段类似,或者您可以根据需要进行修改。现在让我们进入 UI 部分。

要在Repeater控件上显示项目,请使用DataBinder.Eval()方法绑定控件,如下所示,在控件的<ItemTemplate>内。

<asp:Repeater ID="Repeater1" runat="server">
  <ItemTemplate>
    <table>
      <tr>
        <td style="width:70px"><%#DataBinder.Eval(Container.DataItem, "StRoll") %></td>
        <td style="width:150px"><%#DataBinder.Eval(Container.DataItem, "StName") %></td>
        <td style="width:30px"><%#DataBinder.Eval(Container.DataItem, "StPercent") %></td>
      </tr>
    </table>
  </ItemTemplate>
</asp:Repeater>
 
<asp:LinkButton ID="lnkBtnPrev" runat="server" Font-Underline="False"
            OnClick="lnkBtnPrev_Click" Font-Bold="True"><< Prev </asp:LinkButton>
            <input id="txtHidden" style="width: 28px" type="hidden" value="1"
                runat="server" />
            <asp:LinkButton ID="lnkBtnNext" runat="server" Font-Underline="False"
                OnClick="lnkBtnNext_Click" Font-Bold="True">Next >></asp:LinkButton>

要进行自定义分页,请使用两个链接按钮控件,一个用于 <<Prevous,另一个用于 Next>>。除此之外,还要使用一个隐藏字段来维护页面状态(即用户当前所在的页面)。在 <<Prevous 链接点击事件上,将隐藏字段中的值减 1。同样,在 Next>> 链接按钮点击事件上将隐藏字段值加 1,并绑定 Repeater。因此,您可以在两侧导航,项目将相应地显示。代码如下

protected void lnkBtnPrev_Click(object sender, EventArgs e)
    {
        txtHidden.Value = Convert.ToString(Convert.ToInt16(txtHidden.Value) - 1);
        bindrepeater();
    }
 
protected void lnkBtnNext_Click(object sender, EventArgs e)
    {
        txtHidden.Value = Convert.ToString(Convert.ToInt16(txtHidden.Value) + 1);
        bindrepeater();
    }
 
// On page load event..
protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            bindrepeater();
        }
    }

// Bind repeater control..
public void bindrepeater()
    {
        SqlConnection con = new SqlConnection("Your Conection String");
        SqlCommand com = new SqlCommand("sp_StudentRec", con);
        com.CommandType = CommandType.StoredProcedure;
        com.Parameters.Add("@pg", SqlDbType.Int).Value = Convert.ToInt16(txtHidden.Value);
        com.Parameters.Add("@pgSize", SqlDbType.Int).Value = 5;
 
        SqlDataAdapter da = new SqlDataAdapter();
        da.SelectCommand = com;
 
        DataSet ds = new DataSet();
        da.Fill(ds);
        Repeater1.DataSource = ds;
        Repeater1.DataBind();
        pageno(Convert.ToInt16(ds.Tables[1].Rows[0][0].ToString()));
    }

同时,您需要根据控件上存在的项目维护链接按钮的可见性,以便它能够正常工作。为此,函数如下所示。图 2 显示了三个不同的结果。

public void pageno(int totItems)
    {
        // Calculate total numbers of pages
        int pgCount = totItems / 5 + totItems % 5;
 
        // Display Next>> button
        if (pgCount-1 > Convert.ToInt16(txtHidden.Value))
            lnkBtnNext.Visible = true;
        else
            lnkBtnNext.Visible = false;
 
        // Display <<Prev button
        if ((Convert.ToInt16(txtHidden.Value)) > 1)
            lnkBtnPrev.Visible = true;
        else
            lnkBtnPrev.Visible = false;
    }

输出

image002.jpg

image003.jpg

image004.jpg

图 2 输出

一旦你理解了这个概念,你就可以根据你的需求进行修改。我希望这篇文章能帮助您为任何类型的数据控件进行自定义分页,无论是否提供了内置分页属性。

祝您一切顺利,编码愉快。

© . All rights reserved.