データベースをポーリングし、実行時に jqGrid を更新するアプリケーションがあります。すべてをリロードしなくてもクライアント側でデータを操作できるようにするために、datatype: "local" を使用しています。
私の最初の試みは、そのデータ自体を更新し、グリッドのデータを更新して再ロードしました。これは機能しましたが、IE8 (残念ながら私たちの主なターゲット) では、スクロールバーが元の位置にリセットされるときにちらつきが発生します。選択がリセットされるという問題もありますが、それは解決可能です。
grid.setGridParam({ data: localData });
var scrollPosition = grid.closest(".ui-jqgrid-bdiv").scrollTop();
grid.trigger('reloadGrid');
grid.closest(".ui-jqgrid-bdiv").scrollTop(scrollPosition);
2 回目の試行では、操作に応じて個々の行自体を更新します。
if (toUpdate) { /* Not auto sorted */
grid.jqGrid('setRowData', entityUpdate.EntityId, entityUpdate);
}
else if(toAdd) { /* Not auto sorted */
grid.jqGrid('addRowData', entityUpdate.EntityId, entityUpdate);
}
else if(toDelete) {
grid.jqGrid('delRowData', entityUpdate.EntityId);
}
これはうまくいきます。選択はリセットされず、ちらつきもありませんが、最後の問題が 1 つあります。行が再ソートされません。
更新された行はそのまま残り、追加された行は正しい場所に配置されません。「sortGrid」メソッドを使用できますが、グリッド全体の更新に戻ります。addRowData メソッドの「position」パラメーターと「srcrowid」パラメーターの組み合わせを使用して、適切な場所に配置できますが、配置する場所を正確に把握する必要があります。組み込みの並べ替えアルゴリズムを使用して、配置する場所を見つける方法はありますか? コードは次のようになります。
if (toUpdate) {
grid.jqGrid('delRowData', entityUpdate.EntityId);
grid.jqGrid('addRowData', entityUpdate.EntityId, entityUpdate, ?, ?);
}
else if(toAdd) {
grid.jqGrid('addRowData', entityUpdate.EntityId, entityUpdate, ?, ?);
}
else if(toDelete) {
grid.jqGrid('delRowData', entityUpdate.EntityId);
}