¡Una pregunta interesante! +1 de mi parte
El problema con la clasificación de filas o celdas de edición consiste en el acceso al contenido de las celdas de edición. El código actual de jqGrid no hace esto y, por lo tanto, dentro del controlador de eventos click
en los encabezados de columna, se prueba si hay alguna línea de edición en la grilla. Si existen algunas líneas/líneas de edición, la ordenación se detendrá sin para llamar al onSortCol
devolución de llamada.
Por lo tanto, solo es posible la segunda manera en que se guardan o restauran las celdas de edición antes de la clasificación. Para implementar esto, hay un pequeño problema. Si se une un evento adicional click
en los encabezados de columna, se llamará después de el controlador estándar enlazado anterior de jqGrid. Por lo tanto, no se puede guardar o descartar la edición modificada antes de se procesará el evento de clic. Uno puede solucionar el problema de dos maneras: cualquiera puede llamar a la función sortData
desde el nuevo controlador de eventos o uno debe cambiar el orden de las vinculaciones al evento click
. El código siguiente demostrar el segundo enfoque:
$.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]);
}
}
});
donde $grid
se definen como var $grid = $("#list")
. Puedes ver en vivo cómo funciona en the following demo.
muchas gracias, lo probaré –
funciona muy bien. gracias de nuevo. –
@CatalinFlorea: ¡De nada! – Oleg