Me pregunto cómo me puede desencadenar reloadGrid después de una línea de edición de una fila.

<script type="text/javascript">

    jQuery(document).ready(function(){
      var lastcell; 
      jQuery("#grid").jqGrid({
          url:'{{ json_data_handler }}?year={{ get_param_year }}&month={{ get_param_month }}&project_id={{ get_param_project_id }}',
          datatype: "json",
          mtype: 'GET',
          colNames:['hour_record_pk', 'project_pk', 'weekday', 'date', 'sum', 'description'],
          colModel:[
                    {name:'hour_record_pk',index:'hour_record_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'project_pk',index:'project_pk', width:55, sortable:false, editable:true, editoptions:{readonly:true,size:10}},
                    {name:'weekday',index:'weekday', width:300, editable:false, sortable:false},
                    {name:'date_str',index:'date_str', width:300, editable:true, sortable:false, editoptions:{readonly:true}},
                    {name:'sum',index:'sum', width:100, editable:true, sortable:true,editrules:{number:true,minValue:0,maxValue:24,required:true}},
                    {name:'description',index:'description', width:600, editable:true, sortable:false,},
               ],
         jsonReader : {
              repeatitems:false
         },
          rowNum:31,
          rowList:[10,20,31],
          //pager: jQuery('#gridpager'),
          sortname: 'id',
          viewrecords: true,
          sortorder: "asc",
          width: 800,
          height: 750,
          caption:"Hour Record Overview",
          reloadAfterEdit: true, //seems to have no effect
          reloadAfterSubmit: true, //seems to have no effect
          onSelectRow: function(id){    
                if(id && id!==lastcell){
                    jQuery('#grid').jqGrid('restoreRow',lastcell);
                    jQuery('#grid').jqGrid('editRow',id,true);
                    lastcell=id;
                    }
                }, 
          editurl:"{% url set_hour_record_json_set %}"
     }).navGrid('#gridpager');
    });

function reload(result) {
    $("#grid").trigger("reloadGrid"); 
    } 

He creado ya una recarga de método, pero no estoy seguro de donde ponerlo. He intentado:

jQuery('#grid').jqGrid('editRow',id,true,reload());

pero esto ya es llamado cuando el usuario hace clic en una fila.
El código anterior permite que el usuario haga clic en una fila y al presionar enter envían los datos y el registro se crea o se actualiza.

Después de que el usuario crea un objeto nuevo tengo que volver a cargar el grid, ya que necesito el id de objeto del objeto recién creado, con el fin de cuidar de más de edición de esta fila.

Edit: La solución:

onSelectRow: function(row_id){
             if(row_id != null) {
                if(row_id !== last_selected_row) {
                    jQuery('#grid').jqGrid('restoreRow',last_selected_row);
                    jQuery('#grid').jqGrid('saveRow',row_id)
                           .editRow(row_id, true,false,reload);
                    last_selected_row = row_id; 
                } else {
                    last_selected_row=row_id;
                }
              }
            },  

Actualización: Para referencia en el futuro. Todos los usuarios de partida con js cuadrículas podría tener también un vistazo a Slickgrid como me cambié de jqgrid a slickgrid y sólo puedo recomendarlo.

  • Su Edición final: la solución que a mí me ayudó mucho. Gracias por la inclusión.
  • Yo no puedo hacer que el código anterior funcione, me da TypeError: jQuery(«#tnc-lista»).jqGrid(«saveRow», row_id).editRow no es una función
  • No me funciona, desplácese hacia abajo no hay código de trabajo

5 Comentarios

  1. 38

    Aquí es la sintaxis de la editRow función

    jQuery("#grid_id").jqGrid('editRow', rowid, keys, oneditfunc, succesfunc, url, extraparam, aftersavefunc, errorfunc, afterrestorefunc);

    oneditfunc: incendios tras el éxito de la
    el acceso a la fila para la edición, antes de
    para permitir el acceso del usuario a la entrada
    campos. La fila id pasado como un
    parámetro a esta función.

    succesfunc: si define esta función
    se llama inmediatamente después de la
    solicitud es correcta. Esta función
    se pasa los datos devueltos por el
    servidor. Según los datos de
    servidor; esta función debe devolver
    verdadero o falso.

    aftersavefunc: si se definen, este
    se llama a la función después de los datos
    se guarda en el servidor. Los parámetros que se pasan
    para esta función son el rowid y la
    respuesta de la solicitud del servidor.

    En su caso, si desea cuadrícula vuelve a cargar después de la fila se guarda la llamada a editRow método debe leer de la siguiente manera.

    jQuery('#grid').jqGrid("editRow", id, true, '', '', '', '', reload)

    He asignado a su recargar función que vuelve a cargar el grid para ‘aftersavefunc‘ parámetro

    la recarga método en sí debe ser definido de la siguiente manera

    function reload(rowid, result) {
      $("#grid").trigger("reloadGrid"); 
    }
    • En realidad, todas las respuestas me ayudaron a resolver mi problema. Pero esta respuesta creo que me tome una mirada en la dirección correcta en la mayoría de los. Ver a mi de solución de código en la parte de edición de mi pregunta. Gracias.
    • Excelente. Esa era la solución correcta.
    • Donde puedo poner jQuery(‘#grid’).jqGrid(«editRow», id, true, «, «, «, «, reload)
  2. 3

    Probar este

          $("#grid").jqGrid('editRow', rowid, true, null, null, null, {}, aftersavefunc);
    
    //
    
            function aftersavefunc(rowid, result) {
            $("#grid").trigger("reloadGrid");
        }
    
    
    //
  3. 0

    Tener una mirada en el saveRow método:

    saveRow (rowid, succesfunc, url,
    extraparam, aftersavefunc,
    onerrorfunc)

    que define dos de devolución de llamada (successfuncs, aftersavefunc) para ser llamado, cuando la petición se completa con éxito y después de que los datos han sido guardados respectivamente.

    • sí, pero donde tengo que poner esta función? Creo que tengo que insertar en uno de estos eventos: trirand.com/jqgridwiki/doku.php?id=wiki:cell_editing .. pero si afterSubmitCell, afterEditCell o afterSaveCell fuego después de la actualización de celda es enviar a la dirección url: editurl:»{% url set_hour_record_json_set %}»
  4. 0

    De la documentación, creo que afterSaveCell funcionará mejor para usted (afterSubmitCell podría trabajar así, pero parece requerir de un determinado valor de retorno. afterEditCell sucede antes de que el servidor de golpe se produce por lo que será muy pronto).

    jQuery('#grid').jqGrid('editRow', id, true, reload);
    
    jQuery(document).ready(function(){
        var lastcell; 
       jQuery("#grid").jqGrid({
    
          //[snip earlier config]
    
          onSelectRow: function(id){    
                if(id && id!==lastcell){
                    jQuery('#grid').jqGrid('restoreRow',lastcell);
                    jQuery('#grid').jqGrid('editRow',id,true);
                    lastcell=id;
                    }
                }, 
          editurl:"{% url set_hour_record_json_set %}",
          onAfterSaveCell: reload
       }).navGrid('#gridpager');
    });
    
    function reload(result) {
        $("#grid").trigger("reloadGrid"); 
    } 

    Sin embargo, volver a cargar toda la cuadrícula es algo excesivo teniendo en cuenta la información que he descrito hasta ahora. A menos que exista procesamiento del lado del servidor de la información presentada (el significado de los datos en la db podría diferente después de guardar), la carga después de una simple edición me parece una pérdida de tiempo.

    Como cuando estás creando una nueva fila, de nuevo, a menos que exista en el lado del servidor sólo datos fotográficos parece que sería más fácil para empezar el nuevo id del presente y, a continuación, hacer que el cambio individual en jqGrid. Sin embargo, al final depende mucho de cuánto tiempo se tarda volver a cargar toda la tabla.

    • Gracias.. eso suena razonable, pero algo no funciona. La recarga no se activa. ¿Por qué poner jQuery(‘#grid’).jqGrid(‘editRow’, id, cierto, reload); en el principio? Cuando me pongo esta en el inicio de mi cuadrícula nada funciona. Pero de todos modos.. recibiendo el nuevo id de la presente es exactamente lo que quiero lograr. Tal vez mi descripción era un poco engañoso. ¿Sabes cómo puedo conseguir el nuevo db id del presente y el lugar en el jqgrid fila hour_record_pk?
    • Usted tiene que saber que mi mesa se compone de hour_records visto por un mes. Pero sólo cuando el récord de la hora existe para una fecha específica en la fila correspondiente tiene una base de datos de identificación de la base de datos (que se presentan en la columna hour_record_pk). Cuando puedo editar una fila que no tiene un id de los nuevos valores son enviados a la base de datos y se crea un nuevo récord de la hora. Entonces necesito una recarga de la red para obtener la base de datos de identificación o puedo conseguir de alguna manera el nuevo db id del presente. De lo contrario, tengo un problema si el usuario quiere cambiar el recién creado récord de la hora, ya no sé en el lado del servidor que hora-registro para cambiar.
  5. 0

    Ок, ahora copiar-pegar solución que funciona, al menos para mí

     onSelectRow: function(id){
        $('#grid').jqGrid("editRow", id, true, '', '', '', '', reloadTable);
     },
     //more confir
    
     //reload table after submit. Put it somewhere in your JS file
      function reloadTable(result) {
        $('#grid').trigger("reloadGrid");
      }

Dejar respuesta

Please enter your comment!
Please enter your name here