使用 Repeater 控件进行分页






4.08/5 (8投票s)
使用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

图 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;
}
输出
一旦你理解了这个概念,你就可以根据你的需求进行修改。我希望这篇文章能帮助您为任何类型的数据控件进行自定义分页,无论是否提供了内置分页属性。
祝您一切顺利,编码愉快。