2012-03-05 5 views
0

私は興味深い問題があります。私は複数のグリッドを持つ複数のページでこれを行っています。最初のグリッドはうまく動作します。この場合、2番目のグリッドは読み込まれません。次のエラーを与える:this.p is undefined jqgrid

this.pが定義されていないが

... sArray(I)){P = TRUE; H = "最後の"; U = F}他{I = [I]。 P = false} this.each(function(){var D = il .. line 140 jquery.jqGrid.min.js

ユーザが行をクリックすると、いくつかの変数が設定され、関数locationGrid 。)

私は、二重にチェックしており、以下に示すように、私は戻ってデータを取得しています、これは失敗したが、このページで、過去に私のために複数回を働いた言ったように:

{"d": "合計\":1、\ "ページ\":0、\ "レコード\":1、\ "行\":\ {\ "invPartLocId \":1053 \ "inventoryMasterId \":5、\ "location \":null、\ "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.min.js'の代わりに' jquery.jqGrid.src.js'を使用すると、エラーのある場所をより明確に見ることができます。さらに、 'locationGrid'を呼び出すコードを含めるべきです。理解の問題があると思います。'locationGrid'は** **一度呼び出さなければなりません**。 – Oleg

+0

私はjquery.jqGrid.src.jsを使用して切り替えましたが、失敗は2818にあります ni = t.p.rownumbers === true? 1:0; –

答えて

4

申し訳ありませんが、コードはバグです。さらに、コード全体を書き直すことをお勧めします。その理由を説明しようとします。

最初に重要なエラーは、の代わりにlocationGrid$('#invLocAdjustGrid').jqgrid({...});を使用することです。 JavaScriptでは大文字と小文字が区別されるため、jqgridの代わりにjqGridを使用することが非常に重要です。

投稿したコードで定義していない変数と関数tempID,LdclickedおよびgetMainを使用しているため、次の問題があります。

最小限の変更を加えた後the demoが機能します。私はファイルから直接JSONを取得し、wedサーバー上にアクティブなコンポーネントがないので、HTTP GETを使用するために "POST"だけをコメントしました。

もう1つ問題があるのは、サーバーコードが結果をに2回にシリアル化していることです。通常、ASMX WebMethodの誤った使用のために問題が発生します。 でない場合、はオブジェクトをJSONに手動で変換する必要があります。その代わりに、オブジェクト自体を返すだけでよい。そのため、問題のJSONのdプロパティは、オブジェクト自体ではなく、1つのより多くの時間を解析するべきである文字列です。

{ 
    "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

@ジャビエル:ありがとう! – Oleg

関連する問題