2011-05-19 60 views
0

我們使用jqGrid 3.8.2和虛擬滾動來滾動記錄列表。如果用戶慢慢地滾動列表,它會運行良好。只要用戶抓取滾動條並快速滾動到底部,網格中返回的記錄就完全無序,有時會重複。我們爲獲取記錄而調用的AJAX調用將調用一個WCF服務,該服務將記錄從數據庫返回到jqGrid中的AJAX回調,然後將數據加載到網格中。數據庫需要一個頁碼,它反過來指出我們想要的是哪一頁記錄。jqGrid虛擬滾動不以正確的順序返回記錄

由於AJAX調用的時間安排,我非常確定結果會以錯誤的順序返回。這意味着電話並不總是首先出現。較早的調用可能會在早期調用之前返回到jqGrid。

有關如何使此功能正常工作的任何想法?我可以採取哪些步驟幫助我們朝正確的方向前進?

如果有幫助,這裏是JS的配置:

PersonalListContactGridControl.GetGridConfig = function() { 
    var jqGridConfig = { 
     url: Common.AjaxService.serviceUrl + "/GetPersonalListContacts", 
     datatype: "JSON", 
     ajaxGridOptions: { contentType: "application/json; charset=utf-8" }, 
     mtype: "POST", 
     autowidth: true, 
     height: PersonalListContactGridControl.Constants.Height, 
     altRows: true, 
     sortname: "LastName", 
     viewrecords: true, 
     emptyrecords: "", 
     loadtext: '', 
     multiselect: true, 
     //sortorder: "desc", 

     //- virtual scrolling:: 1 ON/0 OFF 
     loadonce: false, // SUPPORT FOR REBIND 
     rowNum: PersonalListContactGridControl.Constants.GridPageSize, 
     scroll: 1, 

     gridview: true, 

     //- column header text 
     colNames: ['EndPointID', 
      PersonalListContactGridControl.Constants.FirstNameColumnDisplayText, 
      PersonalListContactGridControl.Constants.LastNameColumnDisplayText, 
      PersonalListContactGridControl.Constants.EmailFaxColumnDisplayText, 
      PersonalListContactGridControl.Constants.TypeColumnDisplayText], 
     //- column specific definitions 
     colModel: [ 
      { name: 'EndPointID', index: 'EndPointID', hidden: true }, 
      { name: 'FirstName', index: 'FirstName', width: 155, align: 'left', editable: false, title: true, 
       hidden: false, resizable: true, sortable: true, editoptions: { readonly: true }, 
       formatter: PersonalListContactGridControl.formatLink }, 
      { name: 'LastName', index: 'LastName', width: 155, align: 'left', editable: false, title: true, 
       hidden: false, resizable: true, sortable: true, editoptions: { readonly: true }, 
       formatter: PersonalListContactGridControl.formatLink }, 
      { name: 'EmailAddress', index: 'EmailAddress', width: 240, align: 'left', editable: false, title: true, 
       hidden: false, resizable: true, sortable: true, editoptions: { readonly: true }, 
       formatter: PersonalListContactGridControl.formatEmailFax }, 
      { name: 'EndPointType', index: 'EndPointType', width: 60, align: 'left', editable: false, title: true, 
       hidden: false, resizable: true, sortable: true, editoptions: { readonly: true }, 
       formatter: PersonalListContactGridControl.formatType } 
     ], 

     //- jqGrid's "reader" ... the structure of the JSON/XML returned (Fiddler) must match this 
     jsonReader: { 
      root: "d.Contacts", 
      total: function(obj) { 
       return Math.ceil(obj.d.TotalRecords/PersonalListContactGridControl.Constants.GridPageSize); 
      }, 
      records: function(obj) { 
       return obj.d.TotalRecords; 
      }, 
      id: 'EndPointID', 
      repeatitems: false 
     }, 

     serializeGridData: function(jqGridParms) { 
      //alert(jqGridParms.page); 
      return PersonalListContactGridControl.GetRequest(jqGridParms); 
     }, 
     loadComplete: function(data) { 
      if (data.d) { 
       if (data.d.ResponseProperties.Success === false) { 
        if (data.d.ResponseProperties.ErrorMessage.indexOf('The List has been deleted') > -1) { 
         ManagePersonalList.OnPersonalListErrorHandler(); 
         return; 
        } 
       } 
       var grid = PersonalListContactGridControl.Grid(); 
       if (data.d.Contacts == null || data.d.Contacts.length == 0) { // are there any records? 
        // check if row exists 
        if (!grid.getInd(-1)) { 
         if (PersonalListContactGridControl.SearchString == "") { 
          grid.addRowData(-1, { "FirstName": PersonalListContactGridControl.Constants.NoContactDisplayText }); 
         } 
         else { 
          grid.addRowData(-1, { "FirstName": PersonalListContactGridControl.Constants.NoContactForSearchDisplayText }); 
         } 
         grid.find('#-1 input').hide(); // takeout the selection checkbox 
        } 
        PersonalListGridControl.ToggleExportButton(false); 
       } 
       else { 
        if (PersonalListContactGridControl.Constants.dtoToSelectID != null) { 
         if (PersonalListContactGridControl.SelectContactById(PersonalListContactGridControl.Constants.dtoToSelectID, true)) 
          PersonalListContactGridControl.Constants.dtoToSelectID = null; 
        } 
        PersonalListGridControl.ToggleExportButton(true); 
       } 
       // cache the return objects 
       PersonalListContactGridControl.DTOS = PersonalListContactGridControl.DTOS.concat(data.d.Contacts); 
       PersonalListContactGridControl.InitRows(); 
      } 
     }, 
     loadError: function(xhr, status, error) { 
      alert("Type: " + status + "; Response: " + xhr.status + " " + xhr.statusText); 
     }, 

     onCellSelect: function(rowid, iCol, cellcontent, e) { 
      if (iCol == 0) 
       PersonalListContactGridControl.CheckItem(); 
      else 
       PersonalListContactGridControl.SelectContactById(rowid); 
     }, 

     onSelectRow: function(id, status) { 
      if (!status) return; 
     }, 
     onSelectAll: function() { 
      var grid = PersonalListContactGridControl.Grid(); 
      var selections = new Array(); 
      selections = grid.getGridParam('selarrrow'); 
      if (selections[0] == -1) { 
       //if -1, then no rows are available 
       PersonalListContactGridControl.UpdateHeaderCount(0); 
      } 
      else { 
       PersonalListContactGridControl.UpdateHeaderCount(selections.length); 
       ManagePersonalList.OnSelectAllChanged(this, { Ids: selections }); 
      } 
     } 
    }; 

    return jqGridConfig; 
} 

回答

0

試着改變你的JSONReader到..

jsonReader: { 
     root: "d.Contacts", 
     page: "d.currpage", 
     total: "d.totalpages", 
     records: "d.TotalRecords", 
     id: 'EndPointId', 
     repeatitems: false 
    }, 

的d.totalpages和d.currpage應該從AJAX調用回來

相關問題