2012-03-05 4 views
0

У меня есть интересная проблема. Я сделал это на нескольких страницах с несколькими сетками. Первая сетка отлично работает, вторая сетка в этом случае не загружается. и дать следующее сообщение об ошибке:this.p is undefined jqgrid

this.p неопределен

... sArray (я)) {Р = TRUE; ч = "последнего", U = F} еще {г = [I]; P = false} this.each (function() {var D = il .. line 140 jquery.jqGrid.min.js

Пользователь doble нажимает на строку и устанавливает некоторые переменные, а затем вызывает функцию locationGrid ()

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

{"d": "{\" total \ ": 1, \" page \ ": 0, \" records \ ": 1, \" rows \ ": [{\" invPartLocId \ ": 1053, \ "inventoryMasterId \": 5, \ "место \": нулевой, \ "ItemType \": \ "S \", \ "currentQanity \": 1, \ "adjustedQauntity \": 0, \ "newLocationQty \": 0 , \ "deptCode \": \ "1401 \"}}} "}

Любая помощь будет оценена по достоинству.

function locationGrid() { 
     $('#invLocAdjustGrid').jqgrid({ 
      height: 290, 
      loadui: "block", 
      datatype: function (rdata) { getLocationData(rdata); }, 
      colNames: ['invPartID', 'locationPartID', 'Loctaion', 'Type', 'Current QTY', 'Adjusted QTY', 'New Location QTY', 'Dept. Code'], 
      colModel: [ 
        { name: 'invPartLocId', width: 2, sortable: false, editable: false, hidden: true }, 
        { name: 'inventoryMasterId', width: 2, sortable: false, editable: false, hidden: true }, 
        { name: 'location', width: 250, editable: false, sortable: false }, 
        { name: 'itemType', width: 120, editable: false, sortable: false, align: 'center' }, 
        { name: 'currentQanity', width: 50, editable: false, sortable: false }, 
        { name: 'adjustedQauntity', width: 50, editable: false, sortable: false }, 
        { name: 'newLocationQty ', width: 50, editable: false, sortable: false }, 
        { name: 'deptCode', width: 50, editable: false, sortable: false } 
       ], 
      pager: jQuery('#rptCodesPager'), 
      viewrecords: true, 
      width: 890, 
      gridComplete: function() { 
       $('#load_invLocAdjustGrid').hide(); 
       $(this).prop('p').loadui = 'enable'; 
       $('#lui_invLocAdjustGrid').hide(); 

      }, 
      afterInsertRow: function (rowid, aData) { 

      }, 
      ondblClickRow: function (rowid) { 
       var myID = $('#invLocAdjustGrid').getCell(rowid, 'invPartLocId'); 
       Ldclicked(myID); 
      } 
     }); 
    } 
    function getLocationData(rdata) { 
     var theID = tempID; 
     tempID = ""; 
     var myDTO = { 'id': theID }; 
     var toPass = JSON.stringify(myDTO); 
     $.ajax({ 
      type: 'POST', 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      url: "INV_Inventory_Adjustment.aspx/getInventoryLocationById", 
      data: toPass, 
      success: function (data, textStatus) { 
       if (textStatus == "success") 
        ReceivedLocationData(JSON.parse(getMain(data)).rows); 
      }, 
      error: function (data, textStatus) { alert('An error has occured retrieving data!'); } 
     }); 
    } 
    function ReceivedLocationData(data) { 
     var thegrid = $('#invLocAdjustGrid'); 
     var isGood = data.length; 
     for (var i = 0; i < isGood; i++) { 
       thegrid.addRowData(i + 1, data[i]); 


      } 
    } 
+2

вы должны использовать 'jquery.jqGrid.src.js' вместо' jquery.jqGrid.min.js', чтобы увидеть место с более ясной ошибкой. Кроме того, вы должны включить код, который вызывает 'locationGrid'. Я думаю, что есть проблема понимания.'LocationGrid' должен вызываться ** только один раз **. – Oleg

+0

Я переключился на использование jquery.jqGrid.src.js, сбой в строке 2818 ni = t.p.rownumbers === true? 1: 0; –

ответ

4

Извините, но ваш код неисправен. Кроме того, я рекомендую вам переписать весь код, и я попытаюсь объяснить, почему.

Первой важной ошибкой является то, что вы используете $('#invLocAdjustGrid').jqgrid({...}); в locationGrid вместо $('#invLocAdjustGrid').jqGrid({...});. JavaScript чувствителен к регистру, поэтому очень важно использовать jqGrid вместо jqgrid.

Следующая проблема существует, потому что вы используете некоторые переменные и функции tempID, Ldclicked и getMain которые вы не указали в размещенном коде.

После внесения минимальных изменений the demo работ. Я прокомментировал только «POST», чтобы использовать HTTP GET, потому что я получаю JSON непосредственно из файла и не имею активных компонентов на сервере wed.

Еще одна проблема, которую вы очистите, заключается в том, что ваш код сервера сериализует результаты дважды. Как правило, проблема возникает из-за неправильного использования ASMX WebMethods. Нужно не конвертировать объект в JSON вручную. Вместо этого нужно просто вернуть сам объект. Из-за задачей d свойства JSON не сам объект и является строкой, которая должна быть еще раз быть разобрано:

{ 
    "d": "{\"total\":1,\"page\":0,\"records\":1,\"rows\":[{\"invPartLocId\":1053,\"inventoryMasterId\":5,\"location\":null,\"itemType\":\"S\",\"currentQanity\":1,\"adjustedQauntity\":0,\"newLocationQty\":0,\"deptCode\":\"1401 \"}]}" 
} 

Даже такие неправильно отформатированные данные могут быть считаны с помощью jqGrid без использования datatype как функция. Кроме того, вы всегда должны использовать gridview: true и никогда не использовать afterInsertRow и почти никогда не использовать addRowData. Измененный код может быть примерно следующее:

var tempID = "abc"; 
$('#invLocAdjustGrid').jqGrid({ 
    url: "INV_Inventory_Adjustment.aspx/getInventoryLocationById", 
    mtype: "POST", 
    datatype: "json", 
    postData: { 
     id: function() { return tempID; } // ??? I don't know which data should be send 
    }, 
    ajaxGridOptions: { contentType: "application/json" }, 
    serializeRowData: function (data) { 
     return JSON.stringify(data); 
    }, 
    beforeProcessing: function (data) { 
     $.extend (true, data, $.parseJSON(data.d)); 
    }, 
    jsonReader: {repeatitems: false}, 
    loadonce: true, 
    colNames: ['invPartID', 'locationPartID', 'Loctaion', 'Type', 'Current QTY', 'Adjusted QTY', 'New Location QTY', 'Dept. Code'], 
    colModel: [ 
     { name: 'invPartLocId', width: 2, key: true, hidden: true }, 
     { name: 'inventoryMasterId', width: 2, hidden: true }, 
     { name: 'location', width: 250 }, 
     { name: 'itemType', width: 120, align: 'center' }, 
     { name: 'currentQanity' }, 
     { name: 'adjustedQauntity' }, 
     { name: 'newLocationQty ' }, 
     { name: 'deptCode' } 
    ], 
    cmTemplate: {sortable: false, width: 50}, 
    pager: '#rptCodesPager', 
    viewrecords: true, 
    gridview: true, 
    loadui: "block", 
    height: 290, 
    width: 890, 
    ondblClickRow: function (rowid) { 
     //Ldclicked(rowid); 
    } 
}); 

The next demo демонстрируют, что код работы. Я включил в демо вариант loadonce: true, который может быть вам полезен.

+2

такой отличный ответ, и он не помечен как правильный ... – Javier

+1

@Javier: Спасибо! – Oleg