2016-06-24 3 views
-2

Я написал код, какПроблема в пользовательской пагинации

  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 работает неправильно. Пожалуйста, помогите !!!

+0

это плохой дизайн для создания подкачки - вы сохраняете на сессии следующую страницу, номер страницы и все такое? вы даже думаете, что пользователь может открыть более одной страницы одновременно. – Aristos

+0

да, вы правы !!! я храню их в кукисах – Nida

+0

Печенье хуже, и то же самое, что и сеанс - вы сохраняете его на URL-адресе с параметрами – Aristos

ответ

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) 
1

When вы отлаживаете свой код, первое, что нужно сделать, - это попытаться облегчить вашу работу..

Давайте сделаем краткую рефакторинг вашей функции и посмотрим, что не так, когда вы копируете/вставляете код, как здесь. Не стесняйтесь исправить любую письменную ошибку, которую я мог бы сделать здесь, в зависимости от специфики вашего представления.

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); 
    } 

Что неправильно; вы перебираете вперед в этой функции, не назад, что делает ваши проверки неработоспособными, в результате чего вы столкнулись с проблемой. В этом случае установка приращения вашего итератора позволит вам сделать оба поведение в рабочем пути (Рафаель Althaus указует главный недостаток)


В любом случае, с помощью сеанса для записи навигационных данных хлопотно, по многим причинам (Coockie удаляется во время навигации, тайм-аута, форсирует отслеживание состояния на вашем сервере ...)

Вместо этого вы должны использовать данные Запроса и связать свой ретранслятор соответственно с каждым запросом, который вы получаете.

Смежные вопросы