GridView和Repeater自定义分页功能的实现

朋友做的一个网站用aspnetpager控件进行分页放到虚拟空间出现问题,看来用分页控件是不行了,但他近期忙于在公司实习,于是让我帮他写个自定义分页。

经过上网查阅相关资料结合自己之前的知识积累,顺利实现了GridView和Repeater自定义分页功能,GridView分页截图如下:

 

贴上主要实现代码:

 

1、GridView自定义分页前台核心代码:

GridView.aspx

...

<PagerTemplate>
                <br />
                <asp:Label ID="lblPage" runat="server" Text='<%# "共" + ((GridView)Container.NamingContainer).PageCount + "页,当前第" + (((GridView)Container.NamingContainer).PageIndex + 1) + "页" %>'></asp:Label>
                <asp:LinkButton ID="lbtnFirst" runat="server" Text="首页" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
                    CommandName="Page" CommandArgument="First"></asp:LinkButton>
                <asp:LinkButton ID="lbtnPrev" runat="server" Text="上一页" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != 0 %>'
                    CommandName="Page" CommandArgument="Prev"></asp:LinkButton>
                <asp:PlaceHolder ID="numeric" runat="server"></asp:PlaceHolder>
                <asp:LinkButton ID="lbtnNext" runat="server" Text="下一页" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
                    CommandName="Page" CommandArgument="Next"></asp:LinkButton>
                <asp:LinkButton ID="lbtnLast" runat="server" Text="尾页" Enabled='<%# ((GridView)Container.NamingContainer).PageIndex != (((GridView)Container.NamingContainer).PageCount - 1) %>'
                    CommandName="Page" CommandArgument="Last"></asp:LinkButton>
                <asp:DropDownList ID="ddlJumpPage" runat="server">
                </asp:DropDownList>
                <asp:ImageButton ID="btnGo" runat="server" Width="30px" Height="20px" ImageAlign="Bottom" ImageUrl="~/images/go.jpg" CommandName="Go" />
            </PagerTemplate>
 

2、GridView自定义分页后台核心代码:

GridView.aspx.cs

//根据命令来变更当前页码
    protected void gvTest_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        if (e.CommandName == "Page")
        {
            switch (e.CommandArgument.ToString())
            {
                case "First":
                    gvTest.PageIndex = 0;
                    break;
                case "Prev":
                    if (gvTest.PageIndex > 0)
                    {
                        gvTest.PageIndex -= 1;
                    }
                    break;
                case "Next":
                    if (gvTest.PageIndex < (gvTest.PageCount - 1))
                    {
                        gvTest.PageIndex += 1;
                    }
                    break;
                case "Last":
                    gvTest.PageIndex = gvTest.PageCount - 1;
                    break;
                default:
                    gvTest.PageIndex = Int32.Parse(e.CommandArgument.ToString()) - 1;
                    break;
            }
        }
        else
        {
            if (e.CommandName == "Go")
            {
                DropDownList ddlJumpPage = (DropDownList)gvTest.BottomPagerRow.FindControl("ddlJumpPage");
                int index = Int32.Parse(ddlJumpPage.SelectedValue);
                gvTest.PageIndex = index - 1;
                GetData();
            }
        }
    }

    //显示页码导航
    protected void gvTest_RowCreated(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.RowType == DataControlRowType.Pager)
        {
            PlaceHolder ph = (PlaceHolder)e.Row.FindControl("numeric");
            int startIndex = (gvTest.PageIndex) / 10 * 10 + 1;//根据当前页得到第一个页码
            int endIndex = startIndex + 9;//显示10个页码
            if (endIndex > gvTest.PageCount)//判断是否为最后一页
            {
                endIndex = gvTest.PageCount;
            }
            for (int i = startIndex; i <= endIndex; i++)//通过循环动态显示页码
            {
                var lbtn = new LinkButton { CommandName = "Page", CommandArgument = i.ToString(), Text = "[" + i + "]" };
                ph.Controls.Add(i - 1 != gvTest.PageIndex ? (Control)lbtn : new LiteralControl(i.ToString()));
                ph.Controls.Add(new LiteralControl(" "));
            }
        }
    }
 

3、Repeater自定义分页前台核心代码

Repeater.aspx

...

<asp:Repeater ID="rpTest" runat="server" OnItemDataBound="rpTest_ItemDataBound" OnItemCreated="rpTest_ItemCreated">

...

<FooterTemplate>
                <tr>
                    <td colspan="6">
                        <br />
                        共<asp:Label ID="lblPageCount" runat="server" Text=""></asp:Label>页,当前第<asp:Label
                            ID="lblCurrentPage" runat="server" Text=""></asp:Label>页
                        <asp:HyperLink ID="hlFirst" runat="server" Text="首页"></asp:HyperLink>
                        <asp:HyperLink ID="hlPrev" runat="server" Text="上一页"></asp:HyperLink>
                        <asp:PlaceHolder ID="numeric" runat="server"></asp:PlaceHolder>
                        <asp:HyperLink ID="hlNext" runat="server" Text="下一页"></asp:HyperLink>
                        <asp:HyperLink ID="hlLast" runat="server" Text="尾页"></asp:HyperLink>
                        <asp:DropDownList ID="ddlJumpPage" runat="server">
                        </asp:DropDownList>
                        <asp:ImageButton ID="ibtnGo" runat="server" Width="30px" Height="20px" ImageAlign="Bottom"
                            ImageUrl="~/images/go.jpg" OnClick="ibtnGo_Click" />
                    </td>
                </tr>
                </table>
            </FooterTemplate>
</asp:Repeater>
<asp:Label ID="lblMessage" runat="server"></asp:Label>

 

4、Repeater自定义分页后台核心代码

Repeater.aspx.cs

//返回待绑定的数据源
    private PagedDataSource GetPds()
    {
        StudentInfo stuInfo = new StudentInfo();
        DataSet ds = stuInfo.GetStudent();
        PagedDataSource pds = new PagedDataSource();
        pds.DataSource = ds.Tables[0].DefaultView;//设置数据源
        pds.AllowPaging = true;//允许分页
        pds.PageSize = 10;//一页显示10条信息
        if (Request.QueryString["page"] != null)//判断页面传值是否为空
        {
            pds.CurrentPageIndex = Int32.Parse(Request.QueryString["page"].ToString()) - 1;
        }
        else
        {
            pds.CurrentPageIndex = 0;
        }
        return pds;
    }

 

//显示底部分页按钮并向下拉列表控件中填充数据
    protected void rpTest_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (GetPds().DataSourceCount != 0)
        {
            if (e.Item.ItemType == ListItemType.Footer)//判断是否为页脚
            {
                Label lblRecordCount = (Label)e.Item.FindControl("lblRecordCount");
                Label lblPageCount = (Label)e.Item.FindControl("lblPageCount");
                Label lblCurrentPage = (Label)e.Item.FindControl("lblCurrentPage");
                HyperLink hlFirst = (HyperLink)e.Item.FindControl("hlFirst");
                HyperLink hlPrev = (HyperLink)e.Item.FindControl("hlPrev");
                HyperLink hlNext = (HyperLink)e.Item.FindControl("hlNext");
                HyperLink hlLast = (HyperLink)e.Item.FindControl("hlLast");
                DropDownList ddlJumpPage = (DropDownList)e.Item.FindControl("ddlJumpPage");
                int pageCount = GetPds().PageCount;
                int curPage = GetPds().CurrentPageIndex + 1;
                for (int i = 1; i <= pageCount; i++)
                {
                    ddlJumpPage.Items.Add(i.ToString());
                }
                if (pageCount == 1)//若总页数只有一页,则底部分页链接不可用
                {
                    hlFirst.Enabled = false;
                    hlPrev.Enabled = false;
                    hlNext.Enabled = false;
                    hlLast.Enabled = false;
                }
                else
                {
                    if (curPage <= 1)//若当前为首页,则首页和上一页的链接不可用
                    {
                        hlFirst.Enabled = false;
                        hlPrev.Enabled = false;
                        hlNext.Enabled = true;
                        hlLast.Enabled = true;
                    }
                    else
                    {
                        hlPrev.NavigateUrl = "?page=" + (curPage - 1);
                    }
                    if (curPage >= pageCount)//若当前页为最后一页,则下一页和尾页的链接不可用
                    {
                        hlFirst.Enabled = true;
                        hlPrev.Enabled = true;
                        hlNext.Enabled = false;
                        hlLast.Enabled = false;
                    }
                    else
                    {
                        hlNext.NavigateUrl = "?page=" + (curPage + 1);
                    }
                    hlFirst.NavigateUrl = "?page=1";
                    hlLast.NavigateUrl = "?page=" + pageCount;
                }
                lblPageCount.Text = pageCount.ToString();
                lblCurrentPage.Text = curPage.ToString();
            }
        }
        else//若数据源中无信息,则显示相关提示
        {
            rpTest.Visible = false;
            lblMessage.Text = "无相关记录";
        }
    }

 

//显示页码导航
    protected void rpTest_ItemCreated(object sender, RepeaterItemEventArgs e)
    {
        if (GetPds().DataSourceCount != 0)
        {
            if (e.Item.ItemType == ListItemType.Footer)
            {
                PlaceHolder ph = (PlaceHolder)e.Item.FindControl("numeric");
                int pageCount = GetPds().PageCount;
                int curPage = GetPds().CurrentPageIndex + 1;
                int startIndex = (curPage - 1) / 10 * 10 + 1;//根据当前页得到第一个页码
                int endIndex = startIndex + 9;//显示10个页码
                if (endIndex > pageCount)//判断是否为最后一页
                {
                    endIndex = pageCount;
                }
                for (int i = startIndex; i <= endIndex; i++)//通过循环动态显示页码
                {
                    var hl = new HyperLink { ID = "hl" + i, Text = "[" + i + "]", NavigateUrl = "?page=" + i };
                    ph.Controls.Add(i != curPage ? (Control)hl : new LiteralControl(i.ToString()));
                    ph.Controls.Add(new LiteralControl(" "));
                }
            }
        }
    }

 

如果朋友们对上面的代码有好的意见或建议,欢迎批评指正!大家共同进步!现提供完整源码给需要的朋友,下载地址:https://files.cnblogs.com/zhongnanmikky/PageTest.rar

 

posted @ 2010-08-02 01:01  zhongnanmikky  阅读(1069)  评论(0编辑  收藏  举报