2012-02-04 161 views
14

ロード時にjqgridのセルを永続的に更新しようとしています。 setCellを使用できますが、そのページの値のみを更新することがわかります。明示的にセルを実行していない場合は、ページに戻ってください。setCellは、古い値が表示されます。私もsetRowDataを試しましたが、同じことをしているようです。私は1)データをロードする2)いくつかの基準に基づいてデータのいくつかの値を変更する3)変更された値を表示することです私はloadonceを使用しています。 loadonceを使用しているので、このセッションでセルを永久に変更する方法はありませんか?jqgridのデータの値を更新する方法

UPDATE:

エラーを与えていない私のコードを入れますが、すべてのデータを反復処理に失敗:

var set = 0; 

.... 

gridComplete: function(data){ 
    setData(); 
}, 

.... 

beforeRefresh: function(data){ 
    set = 0; 
}, 

.... 

function setData(){ 

if(set == 1) return; 
... //create hash up here 
    var dataArray = jQuery("#grid").jqGrid('getGridParam', 'data'); 
    var j = 1; 
    for (var rows in dataArray) { 
    var key = dataArray[rows].name; 
    dataArray[rows].level = hashTable[key]; 
    j++; 
    } 
    alert(j); 
} 

これはローカルにロードされ、アレイ内のすべての項目を循環されていません。たとえば、ページサイズが30に設定されている場合、ローカルにロードされたアイテムの数にかかわらず、alert(j)は30を返します。ただし、グラフを更新すると、jが正しい数になります。それぞれのケースでgetGridParamの動作が異なるのはなぜですか?

答えて

30

loadonce: trueを使用する場合、をご存知でしょう。ローカルデータはjqGridによって保持されます。 jqGridには、data_indexという2つのオプションがあります。 dataは、すべての項目がnameという列のプロパティとしてnameプロパティを持ち、colModelの項目の配列です。 id(ROWID)で項目を検索する必要がある場合は、data配列内のROWIDを持つ項目に_index[rowid]を使用できます。だから、列のデータを変更する'myColumn'あなたが行う必要があり、次の

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
var dataArray = myGrid.jqGrid('getGridParam', 'data'), 
    indexes = myGrid.jqGrid('getGridParam', '_index'); 
dataArray[indexes[rowid]].myColumn = newValue; 

UPDATED:ここに来たすべての人のために

// first change the cell in the visible part of grid 
myGrid.jqGrid('setCell', rowid, 'myColumn', newValue); 

// now change the internal local data 
myGrid.jqGrid('getLocalRow', rowid).myColumn = newValue; 
+0

残念ながら、私はこれを完全に理解していません。 'dataArray [indexes [rowid]]。myColumnを実行するにはどうすればよいですか? personNameという列の正確なコードは次のようになります:dataArray [indexes [rowid]]。 'personName'?そのため、エラーが発生しました。また、なぜsetCellも呼び出す必要がありますか?データ配列を実際に変更している場合、データのレンダリングで新しい値が表示されることはありませんか? – WildBill

+0

また、あなたのコードでは、 'setCell'を呼び出して、データ配列を変更すると言っています。データ配列は、setCellが正しく動作するセルよりもはるかに大きいはずですか?私はもはやsetCellを呼び出す必要はなく、ページ、ソート、フィルター、訂正のたびに呼び出す必要があります。 – WildBill

+2

@WildBill: 'dataArray [indexes [rowid]]。personName'または' dataArray [indexes [rowid]] ['personName'] 'は*内部* jqGridデータのみを変更しますが、'​​'グリッドの要素。内部データを変更して 'trigger( 'reloadGrid')を呼び出すことはできますが、' setCell'の使い方はグリッドの完全なリロードと同じです。 – Oleg

0

:あなたは、ローカルデータを変更するために文書化さgetLocalRowメソッドを使用することができますgoogleから、ここに更新された答えです!

重要なのは、getInd-Methodを呼び出すことによって取得できるインデックスです。 RowID!= localRowDataのインデックスなので、 (EQ ROWID:。jqg204、インデックス:5)

EDIT: "キー:真" に設定した場合colmodelにあなたがあなた自身のROWID(切り抜いた私の例から "jqg ###" から、通常はPKを設定することができますデータベーステーブル)

var ind = myGrid.getInd(rowId); 
var localRowData = myGrid.jqGrid('getLocalRow', ind); 
localRowData.myColumn = newValue; 

希望に役立つ希望!

0

私は同様の問題がありました:
特定のユーザーアクション(無関係)で行を更新する必要がありました。
そのために、テーブルをフィルタリングした後でも、 'data'オブジェクトから正確な行を知る必要がありました。
はだから、変更された行を識別するための方法を発見 - I「はloadComplete」イベントで、「データ」オブジェクトの各項目のためのRowIDプロパティを追加した:フォーマッタコードで、

loadComplete: function() { 
      if (firstRun) { 
       firstRun = false; 
       var dataArray = $('#jqGrid').jqGrid('getGridParam', 'data'); 
       $(dataArray).each(function (index) { 
        dataArray[index].RowID = index + 1; 
       }); 
      } 
     } 

そして今私はrDataにアクセスすることができました。アクションが実行された正確な行を識別し、その 'データ'表現を取得/設定するRowID

関連する問題