Una domanda interessante! +1 da me.
Il problema con l'ordinamento di modifica di righe o celle consiste nell'accesso al contenuto delle celle di modifica. Il codice corrente di jqGrid non lo fa e così all'interno del gestore di eventi click
sulle intestazioni delle colonne ci sono test se ci sono delle righe di modifica nella griglia. Se esistono alcune righe/righe di modifica, l'ordinamento verrà interrotto senza per chiamare il callback onSortCol
.
Quindi è possibile solo il secondo modo in cui è possibile salvare o ripristinare le celle di modifica prima di ordinare. Per implementare questo c'è un piccolo problema. Se si uniscono ulteriori eventi click
nelle intestazioni delle colonne, si chiamerà dopo il precedente gestore standard associato di jqGrid. Quindi non è possibile salvare o annullare la modifica modificata prima dello l'evento click verrà elaborato. Si può risolvere il problema in due modi: o si può chiamare la funzione sortData
dal nuovo gestore di eventi o si dovrebbe cambiare l'ordine delle associazioni per l'evento click
. Il codice seguente dimostra il secondo approccio:
$.each($grid[0].grid.headers, function() {
var $th = $(this.el), i, l, clickHandler, clickHandlers = [],
currentHandlers = $th.data('events'),
clickBinding = currentHandlers.click;
if ($.isArray(clickBinding)) {
for (i = 0, l = clickBinding.length; i < l; i++) {
clickHandler = clickBinding[i].handler;
clickHandlers.push(clickHandler);
$th.unbind('click', clickHandler);
}
}
$th.click(function() {
var p = $grid[0].p, savedRow = p.savedRow, j, len = savedRow.length;
if (len > 0) {
// there are rows in cell editing or inline editing
if (p.cellEdit) {
// savedRow has the form {id:iRow, ic:iCol, name:nm, v:value}
// we can call restoreCell or saveCell
//$grid.jqGrid("restoreCell", savedRow[0].id, savedRow[0].ic);
$grid.jqGrid("saveCell", savedRow[0].id, savedRow[0].ic);
} else {
// inline editing
for (j = len - 1; j >= 0; j--) {
// call restoreRow or saveRow
//$grid.jqGrid("restoreRow", savedRow[j].id);
$grid.jqGrid("saveRow", savedRow[j].id);
}
}
}
});
l = clickHandlers.length;
if (l > 0) {
for (i = 0; i < l; i++) {
$th.bind('click', clickHandlers[i]);
}
}
});
dove $grid
sono definiti come var $grid = $("#list")
. Puoi vedere in diretta come funziona su the following demo.
grazie mille, ci provo io –
funziona alla grande. grazie ancora. –
@CatalinFlorea: prego! – Oleg