2012-02-14 19 views
6

Mi uso de la cuadrícula implica ordenar mientras tengo algunas filas en el modo de edición en línea.Problema con la columna de ordenación al editar filas en línea en jqGrid

Las preguntas serían:

  1. ¿Hay alguna manera de ejecutar la clasificación, mientras que la edición en línea una o más filas?

  2. Si no, ¿hay un evento que saltará al hacer clic en los encabezados de columna, mientras que la edición en línea una o más filas? (Un evento en el que tal vez puede quitar la edición, antes de la clasificación del contenido)

Gracias, Catalin

Respuesta

7

¡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.

+0

muchas gracias, lo probaré –

+0

funciona muy bien. gracias de nuevo. –

+0

@CatalinFlorea: ¡De nada! – Oleg

1

Si desea probar la opción 2, puede conectar el evento onSortCol. Allí puede cancelar el modo de edición de todas las filas y luego permitir que se ejecute el género. Solo asegúrese de no devolver "stop" o la clasificación no se realizará en absoluto.

Levantado inmediatamente después de hacer clic en la columna ordenable y antes de ordenar los datos.

Puede obtener toda la documentación here.

+0

Ya lo he probado. No se dispara mientras se editan las filas de la grilla. –

Cuestiones relacionadas