自定义分页中的问题

时间:2016-06-24 09:11:24

标签: c# asp.net c#-4.0 pagination

我写了像

这样的代码
          protected void lnkprev_Click(object sender, EventArgs e)
    {

        List<ListItem> pages = new List<ListItem>();
        int pagecount = Convert.ToInt32(Session["pagecount"].ToString());
        int lastnumber = Convert.ToInt32(Session["lastnumber"].ToString());
        int prevtennumber = lastnumber - 10;
        for (int i=prevtennumber ; i <= pagecount; i++)
        {
            if (i < prevtennumber)
            {
                pages.Add(new ListItem(i.ToString(), i.ToString(), i != PageIndex));
                if (i == 1)
                {
                    lnkprev.Visible = false;
                }
            }
            Session["lastnumber"] = prevtennumber;
            Session["pagecount"] = pagecount;
            rptPager.DataSource = pages;
            rptPager.DataBind();
        }
     }

    protected void lnknext_Click(object sender, EventArgs e)
    {
        List<ListItem> pages = new List<ListItem>();
        int pagecount = Convert.ToInt32(Session["pagecount"].ToString());
        int lastnumber = Convert.ToInt32(Session["lastnumber"].ToString());
        int nexttennumber = lastnumber + 10;
        for (int i = lastnumber; i <= pagecount; i++)
        {
            if (i < nexttennumber)
            {
                pages.Add(new ListItem(i.ToString(), i.ToString(), i != PageIndex));
                if (i == pagecount)
                {
                    lnknext.Visible = false;
                }
           }
            Session["lastnumber"] = nexttennumber;
            Session["pagecount"] = pagecount;
            rptPager.DataSource = pages;
            rptPager.DataBind();
        }
    }

我正在使用页码填充转发器,该页码用于网格视图中的分页。实际上我必须首先显示前十个数字。当用户点击下一个按钮时,页码应从10到20开始,依此类推。 现在下一个按钮工作正常。 prev按钮无法正常工作。 请帮忙!!!

2 个答案:

答案 0 :(得分:1)

当您调试代码时,首先要做的是尝试让您的工作更轻松

让我们快速重构你的next()函数,看看你复制/粘贴代码时的错误,就像你在这里做的那样。请随意纠正我在这里可能做的任何写作错误,具体取决于您的观点细节。

 protected void CreatePages(int startingPoint, int checkingPoint, int endPoint, Button button)
        {
            List<ListItem> pages = new List<ListItem>();
            for (i = startingPoint; i < endPoint; i++)
            {
            if (i < checkingPoint)
            {
                pages.Add(new ListItem(i.ToString(), i.ToString(), i != PageIndex));
                if (i == endPoint)
                {
                    button.Visible = false;
                }
           }
            }
            Session["lastnumber"] = checkingPoint;
            Session["pagecount"] = endPoint;
            rptPager.DataSource = pages;
            rptPager.DataBind();
            }

   protected void lnknext_Click(object sender, EventArgs e)
    {
        int pagecount = Convert.ToInt32(Session["pagecount"].ToString());
        int lastnumber = Convert.ToInt32(Session["lastnumber"].ToString());
        int nexttennumber = lastnumber + 10;
        CreatePagesAndBindRepeater(lastnumber, nexttennumber, pagecount, lnknext);
        }

现在,您实际为prev()做的是:

         protected void lnkprev_Click(object sender, EventArgs e)
{

    int pagecount = Convert.ToInt32(Session["pagecount"].ToString());
    int lastnumber = Convert.ToInt32(Session["lastnumber"].ToString());
    int prevtennumber = lastnumber - 10;
    CreatePagesAndBindRepeater(lastnumber, prevtennumber, pagecount, lnkprev);
     }

哪个错了;你在这个功能中向前推进,不向后,使你的检查不起作用,导致你面临的所有麻烦。在这种情况下,设置迭代器的增量将允许您以工作方式执行这两种行为(RaphaëlAlthaus指出主要缺陷)

在任何情况下,使用会话来记录导航数据都很麻烦,原因很多(Coockie在导航期间被删除,超时,在服务器中强制进行状态跟踪......)

您应该使用请求数据,并根据您获得的每个请求相应地绑定转发器。

答案 1 :(得分:0)

除了其他评论之外(我认为还有代码重写工作)

for (int i=prevtennumber ; i <= pagecount; i++)
        {
            //this will never be reached, as you start with i = prevtennumber
            if (i < prevtennumber)

所以我至少会说(或者除了prevtennumber以外的任何逻辑上的东西)

if (i < lastnumber)