編集:最終的な解決策は以下のとおりです。
ヘッダーのドラッグまたは列選択プラグインを介して列の並べ替えを実装しようとしても、列を並べ替えた後、任意の列ヘッダーをクリックして並べ替えると、並べ替えられた列がテーブルの元の位置に読み込まれます。ソート可能な方法の使用:
sortable: {
update: function (perm) {
/*
* code to save the new colmodel goes here
*/
// the following line doesn't seem to do anything... just seems to return an array identical to 'perm'
$("#mainGrid").jqGrid("getGridParam", "remapColumns");
// if included, the next line causes the headers to not move
$("#mainGrid").jqGrid("remapColumns", perm, true);
// this alternate allows them to move, but the newly sorted columns still get remapped to their original position
$("#mainGrid").jqGrid("remapColumns", [0,1,2,3,4,5,6,7,8,9,10,11,12], true);
/* the following allows the headers to move, and allows the sort to occur ONLY
* if the order coming back from the database is unchanged. Note that in my real
* code I create an array of consecutive integers to pass as the first param to
* remapColumns()
*/
$("#mainGrid").jqGrid("remapColumns", [0,1,2,3,4,5,6,7,8,9,10,11,12], true, false);
}
}
このページに初めてアクセスすると、xmlファイルからデフォルトの列モデルが作成されます。ユーザーがヘッダーを並べ替えると、新しい列モデルと列名がJSON文字列としてデータベースに保存されます。ユーザーが別のデータベース呼び出しを行うと、関数はデータベースから新しい列の順序を読み取り、新しい順序でデータ配列を作成します。
問題は、jqGridが列を再マップした後でも、サーバーから元の順序でデータが返されることを期待していることのようです。したがって、元のデータが
[ [A1, B1, C1], [A2, B2, C2], [A3, B3, C3] ]
列をC|の順序に再マッピングした後 A | B、jqGridは、データが元の順序で返されることを望んでいます。
私の最終的な解決策は、列モデルの状態を保存するコードをsortable.update()関数から削除し、それをwindow.onbeforeunload()に配置することでした。このように、状態はユーザーがページを終了したときにのみ保存されます。これが他の誰かに役立つことを願っています。