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");
});
あなたが見ることができるように、「更新」ボタンは、ちょうど更新を引き起こすために、「hiddenE」フィールドを変更して「visibleB」フィールドに触れています。しかし、実際には、 "visibleA"フィールドが変更されて破壊されるということが起こります。
アイデア?
は、あなたの答えをいただき、ありがとうございます。実際にはバージョン5.2.1がインストールされています。関連する行が見つかりました。実際は "var tcell = $(" td:eq( "+ pos +") "、ind)、cl = 0、rawdat = [];"です。私は問題はまだ完全に解決されていないと思う。 – Udi
提案された修正を試した後、確かに正しいセルが更新されています。しかし、もう1つの問題は、Formatterへの "rowobject"パラメータが最初(行の作成)とは異なる動作をすることです。最初の呼び出しでは、フィールドを持つ素敵なオブジェクトです。 "setCell"に続いて、それはフィールドなしでHTML情報を保持する単なるリストです。その理由は何ですか? – Udi
あなたのコードのようなカスタムフォーマッタ関数を定義するとき、グリッドはフォーマッタから定義された内容を知らないので独自のカスタムunformat関数を定義して元のデータに戻す必要があることを知っておく必要があります。 [Guriddo Documentation here](http://www.guriddo.net/documentation/guriddo/javascript/user-guide/formatters/#custom-formatter)を読むことをお勧めします。さらに、現在のsetCellコードにはこれに関する小さな問題があることを知る必要があります。この修正は明日公開され、ダウンロード方法をお知らせします。 –