2013-06-21 2 views
2

В jqGrid есть свойство loadonce: true, тогда я получаю только записи первой страницы. как я могу получить записи второй и третьей страницы.Пейджинг не работает, когда loadonce: true в jqGrid

код:

$(function() { 

     $("#pendingAppgrid").jqGrid({ 
      colNames: ['Name', 'Email'], 
      colModel: [ 
         { name: 'Name', index: 'Name', sortable: true, align: 'left', width: '200', 
          editable: false, edittype: 'text',search:true 

         }, 

         { name: 'Email', index: 'Email', sortable: false, align: 'left', width: '200', 
          editable: false, edittype: 'text',search:true 
         }, 
        ], 
      pager: jQuery('#pager'), 
      sortname: 'Name', 
      rowNum: 15, 
      rowList: [10, 20, 25], 
      sortorder: "desc", 
      height: 345, 
      ignoreCase: true, 
      viewrecords: true, 
      rownumbers: true, 
      caption: 'Pending Approvals', 
      width: 660, 
      url: "@Url.Content("~/Home/PendingApprovals")", 
      datatype: 'json', 
      mtype: 'GET', 
      loadonce: true 
     }) 
     jQuery("#pendingAppgrid").jqGrid('filterToolbar', { searchOnEnter: true, enableClear: false }); 

    }); 

Серверный код

public ActionResult PendingApprovals(int page, int rows, string sidx, string sord) 
     { 

      //return View(GetPendingApprovals()); 
      int currentPage = Convert.ToInt32(page) - 1; 
      int totalRecords = 0; 
      List<ViewModels.Channel.UserChannels> lTemChannel = new List<ViewModels.Channel.UserChannels>(); 
      List<ViewModels.Channel.UserChannels> lstChannel = new List<ViewModels.Channel.UserChannels>(); 
      lTemChannel = GetPendingApprovals(); 
      foreach (ViewModels.Channel.UserChannels cha in lTemChannel) 
      { 
       ViewModels.Channel.UserChannels channelWithLogo = new ViewModels.Channel.UserChannels(); 
       channelWithLogo.ID = cha.ID; 
       channelWithLogo.Name = cha.Name; 
       channelWithLogo.Email = cha.Email; 

       lstChannel.Add(channelWithLogo); 
      } 
      totalRecords = lstChannel.Count; 
      var totalPages = (int)Math.Ceiling(totalRecords/(float)rows); 
       lstChannel = lstChannel.ToList<ViewModels.Channel.UserChannels>(); 

      IPagedList<ViewModels.Channel.UserChannels> ilstChannel; 
      switch (sord) 
      { 
       case "desc": 
        ilstChannel = lstChannel.OrderByDescending(m => m.Name).ToPagedList(page, rows); 
        break; 
       case "asc": 
        ilstChannel = lstChannel.OrderBy(m => m.Name).ToPagedList(page, rows); 
        break; 
       default: 
        ilstChannel = lstChannel.OrderBy(m => m.Name).ToPagedList(page, rows); 
        break; 
      } 

      var data = ilstChannel; 

      var jsonData = new 
      { 
       total = totalPages, 
       page, 
       records = totalRecords, 

       rows = (from m in data 
         select new 
         { 

          id = m.ChannelID, 
          cell = new object[] 
          { 
           m.Name, 
           m.Email 
          } 
         }).ToArray() 
      }; 
      return Json(jsonData, JsonRequestBehavior.AllowGet); 
     } 

Здесь я получаю только первую страницу записей. У меня больше страниц. функциональность поиска работает нормально. проблема в том, что я только первые записи. не получая записи других страниц. как я могу получить другие записи на странице. Пожалуйста, помогите.

ответ

4

Если вы используете loadonce:true jqGrid, измените параметры типа данных на «local» после первого загрузки данных из сетки. Вся следующая перезагрузка сетки (сортировка, подкачка, фильтрация) работает локально. Если вы хотите обновить данные сетки с сервера еще раз, вы должны установить тип данных на свое исходное значение ('json' или 'xml'). Например:

$("#pendingAppgrid").setGridParam({datatype:'json', page:1}).trigger('reloadGrid'); 

Пожалуйста, посетите http://www.trirand.com/jqgridwiki/doku.php?id=wiki:options для получения более подробной информации о параметрах jqGrid.

+0

i сделал то же самое. измененный тип данных = 'local'. и разместил то, что вы дали код внутри функции, после «filterToolbar». но я не получаю. – Ram

+1

@Ram, вам не нужно менять тип данных на локальный, сам jqGrid сделал это после первой загрузки, когда у вас есть опция loadonce как true. Вы должны добавить этот код в пейджер, пожалуйста, напишите пейджинговый код. –

+0

ОК. пожалуйста, можете ли вы правильно разместить пейджинг для этого. Здесь я получаю только записи первой страницы. если я изменяю страницу нет: 2 в разделе нижнего колонтитула, не отображая записи второй страницы. – Ram

0

Проблема сложна, прочитайте все даже comentaries, вам нужно восстановить реальную страницу в Jgrid с:

var llPage = $("#listaCfdi").jqGrid('getGridParam', 'page'); 
//1 but this page is not the page of the "pager" and is before to call the method that fill the jgrid again 
//, so the page will change after to fill the grid, you must call "onPaging" to fill again the Jgrid, like this: 

//2 
, onPaging: function (pgButton) { 
     FillAgainJgrid(); 
    } 

и FillAgainJgrid(); (в этом примере) вам нужно снова вызвать другой метод, который будет иметь реальную страницу «пейджера», которую хочет пользователь, например, jgrid находится на странице: 5, и вам нужна страница las, что-то вроде страницы : 15, поэтому второй вызов будет иметь реальную страницу, что импортная вещь второго вызова. Только для двух вызовов необходимо убедиться, что страница верна. И в этом примере FillAgainJgridEnsure(); точно соответствует FillAgainJgrid(); за исключением того, что оленья кожа снова

//3. In the server side, the page you are passed to the method only will work in the first call, because have all the data 
//, and all the pages, but in example in the second call with the page:3, the jgrid will lost all the real information about the size of page, and only will return page:3 like if was the only one, you need a trick like this 
//, (they are two list, one with all the data, and then you will get only the page you need, and the second list will have all the other rows in empty 
//, so in this way you will get always all the correct rows number of the query, you need Concat in this example because we need all the rows, and if you are filled with dataset, in the sql server you need to use union all) : 

ENTIDADES.Cfdi[] resultadoDos = null; //This is the class to provide the correct number of rows 

     //this is the query that always will have all the data 
     resultado = new CLASES.DAL.Facturacion().ObtenerCfdiDisponibles(criteriosBusqueda); 
     if (resultado.Length > 100) 
     { 
      resultadoDos = new ENTIDADES.Cfdi[resultado.Length - 100]; 
      for (int i = 0; i < resultado.Length - 100; i++) 
      { 
       ENTIDADES.Cfdi referenciaVacia = new ENTIDADES.Cfdi(); 
       resultadoDos[i] = referenciaVacia; 
      } 
     } 
//Paging here, in the server size 
     resultado = resultado.OrderBy(p => p.Cliente).Skip(((Convert.ToInt32(_Pagina)) - 1) * 100).Take(100).ToArray(); 
     if (resultadoDos != null) //if there are more that 100 rows, in this example 
     {//concat the page and the fill data empty 
      resultado = resultado.Concat(resultadoDos).OrderByDescending(x => x.Cliente).ToArray(); 
     } 

     regresar = Newtonsoft.Json.JsonConvert.SerializeObject(resultado); 

// Примечание onPaging, не забывайте OrderByDescending (в данном примере), так как он будет отображаться первым данных, которые имеют строки заполнены, 100 является размер строк страницы.

Omar Romero Mexico