2017-11-20 4 views
0

HTMLコードを返すフォーマッタを使用して、セル内に小さなテーブル(HTMLテーブル)を定義しようとしています。内容は、同じレコードのいくつかの隠しフィールドに基づいています。setCellが間違ったセルを更新する

セル内のテーブルの初期設定は順調です。問題は、後で "setCell"を使用して、隠しフィールドを変更し、テーブル構造のフィールドへの影響を確認することです。

何が起こるかは、jqGridがWRONGセルに近づき、混乱を招くことです。私はそれを実証するjsFiddleを作成しました。

<table id="grid"></table> 
<div> 
<input id="update" type="button" value="Update"> 
</div> 

var mydata = [{ 
    id: 1, 
    hiddenA: 1, 
    hiddenB: 2, 
    hiddenC: 4, 
    hiddenD: 8, 
    hiddenE: 16, 
    hiddenF: 32, 
    hiddenG: 64, 
    hiddenH: 128 
}]; 

$("#grid").jqGrid({ 
    datatype: "local", 
    data: mydata, 
    height: 250, 
    colNames: [ 
    'id', 
    'hiddenA', 
    'hiddenB', 
    'hiddenC', 
    'hiddenD', 
    'hiddenE', 
    'hiddenF', 
    'hiddenG', 
    'hiddenH', 
    'visibleA', 
    'visibleB' 
    ], 
    colModel: [ 
    {name: 'id', hidden: true, key: true}, 
    {name: 'hiddenA', hidden: true, width: 50}, 
    {name: 'hiddenB', hidden: true, width: 50}, 
    {name: 'hiddenC', hidden: true, width: 50}, 
    {name: 'hiddenD', hidden: true, width: 50}, 
    {name: 'hiddenE', hidden: true, width: 50}, 
    {name: 'hiddenF', hidden: true, width: 50}, 
    {name: 'hiddenG', hidden: true, width: 50}, 
    {name: 'hiddenH', hidden: true, width: 50}, 
    {name: 'visibleA', width: 80, formatter: addFormatter}, 
    {name: 'visibleB', width: 80, formatter: subFormatter} 
    ], 
    caption: "Table within a cell", 
    gridview: true, 
    loadonce: true, 
    viewrecords: true, 
    loadui: "disable", 
}); 

function addFormatter(cellvalue, options, rowObject) { 
    var ret = " \ 
    <table class='details-table'> \ 
    <tr><td>A+B:</td><td class='al-right'>{0}</td></tr> \ 
    <tr><td>B+C:</td><td class='al-right'>{1}</td></tr> \ 
    <tr><td>C+D:</td><td class='al-right'>{2}</td></tr> \ 
    <tr><td>D+A:</td><td class='al-right'>{3}</td></tr> \ 
    </table> \ 
    "; 
    ret = ret.replace("{0}", rowObject.hiddenA + rowObject.hiddenB); 
    ret = ret.replace("{1}", rowObject.hiddenB + rowObject.hiddenC); 
    ret = ret.replace("{2}", rowObject.hiddenC + rowObject.hiddenD); 
    ret = ret.replace("{3}", rowObject.hiddenD + rowObject.hiddenA); 

    return (ret); 
} 

function subFormatter(cellvalue, options, rowObject) { 
    var ret = " \ 
    <table class='details-table'> \ 
    <tr><td>E-F:</td><td class='al-right'>{0}</td></tr> \ 
    <tr><td>F-G:</td><td class='al-right'>{1}</td></tr> \ 
    <tr><td>G-H:</td><td class='al-right'>{2}</td></tr> \ 
    <tr><td>H-A:</td><td class='al-right'>{3}</td></tr> \ 
    </table> \ 
    "; 
    ret = ret.replace("{0}", rowObject.hiddenE - rowObject.hiddenF); 
    ret = ret.replace("{1}", rowObject.hiddenF - rowObject.hiddenG); 
    ret = ret.replace("{2}", rowObject.hiddenG - rowObject.hiddenH); 
    ret = ret.replace("{3}", rowObject.hiddenH - rowObject.hiddenE); 

    return (ret); 
} 

$("#update").bind("click", function() { 
    $("#grid").jqGrid("setCell", 1, "hiddenE", 256); 
    $("#grid").jqGrid("setCell", 1, "visibleB", "1"); 
}); 

jFiddle Example

あなたが見ることができるように、「更新」ボタンは、ちょうど更新を引き起こすために、「hiddenE」フィールドを変更して「visibleB」フィールドに触れています。しかし、実際には、 "visibleA"フィールドが変更されて破壊されるということが起こります。

アイデア?

答えて

0

これは、使用するバージョン4.6のバグです。問題は、更新するセル内の表セルの場合にsetCellメソッドにあります。

私たちがサポートしているGuriddo jqGridにも同じ問題が残っています。私たちはGitHubでこの問題を解決しました。あなたがGuriddo jqGrid製品を使用したい場合には、それをテストすることができます。

場合によっては、他のjqGridクローン製品にアップグレードすることができないということを知っています。これが私たちが言うことのない理由です。この「古い」jqGrid製品を使用しないでください。

JavaScriptの知識がほとんどなくても、4.6 jqGridコードを修正して使用することができます。この目的のために、jquery.jqGrid.jsファイル(縮小されていないファイル)を開き、setCellメソッドを見つける必要がありますライン3646.周り表現に

var tcell = $("td:eq("+pos+")",ind); 

を見つけ、その後、このファイルを縮小化し、それを使用することができます

var tcell = ind.cells[pos]; 

と交換してください。場合

あなたがサポートjqGridクローンのいずれかにアップグレードすることができ、これを行うにはしたくない場合は - 無料jqGridたり、商業Guriddo jqGrid

+0

は、あなたの答えをいただき、ありがとうございます。実際にはバージョン5.2.1がインストールされています。関連する行が見つかりました。実際は "var tcell = $(" td:eq( "+ pos +") "、ind)、cl = 0、rawdat = [];"です。私は問題はまだ完全に解決されていないと思う。 – Udi

+0

提案された修正を試した後、確かに正しいセルが更新されています。しかし、もう1つの問題は、Formatterへの "rowobject"パラメータが最初(行の作成)とは異なる動作をすることです。最初の呼び出しでは、フィールドを持つ素敵なオブジェクトです。 "setCell"に続いて、それはフィールドなしでHTML情報を保持する単なるリストです。その理由は何ですか? – Udi

+0

あなたのコードのようなカスタムフォーマッタ関数を定義するとき、グリッドはフォーマッタから定義された内容を知らないので独自のカスタムunformat関数を定義して元のデータに戻す必要があることを知っておく必要があります。 [Guriddo Documentation here](http://www.guriddo.net/documentation/guriddo/javascript/user-guide/formatters/#custom-formatter)を読むことをお勧めします。さらに、現在のsetCellコードにはこれに関する小さな問題があることを知る必要があります。この修正は明日公開され、ダウンロード方法をお知らせします。 –

関連する問題