2009-05-30 12 views
33

Al usar jqGrid, ¿cómo fuerza que una celda se cargue en su vista editable en la carga de la página, así como cuando se hace clic en ella?jqGrid con una columna de casilla de verificación editable

Si configura 'edición de celda' como a continuación, la casilla de verificación solo aparece cuando hace clic en la celda.

{ name: 'MyCol', index: 'MyCol', editable:true, edittype:'checkbox', editoptions: { value:"True:False" }, 

cellEdit:true, 

también al hacer clic en la casilla de verificación, hay una manera de enviar un mensaje al servidor AJAX instante en lugar de tener que depender de que el usuario presione entrar?

Respuesta

75

Para permitir que las casillas de verificación para estar siempre haga clic-poder, utilice disabled propiedad del formateador casilla:

{ name: 'MyCol', index: 'MyCol', 
    editable:true, edittype:'checkbox', editoptions: { value:"True:False"}, 
    formatter: "checkbox", formatoptions: {disabled : false} , ... 

para responder a su segunda pregunta, tendrá que configurar un controlador de eventos para las casillas de verificación, de manera que cuando se hace clic en una función se llama a, por ejemplo, enviar una POST AJAX al servidor. Aquí hay un código de ejemplo para comenzar. Usted puede agregar esto al caso loadComplete:

// Assuming check box is your only input field: 
    jQuery(".jqgrow td input").each(function(){ 
     jQuery(this).click(function(){ 
      // POST your data here... 
     }); 
    }); 
+1

@Justin Gran respuesta !! Gracias, si fuera mi pregunta, te daría el tic. – Dan

+4

¡Fantástico! ¡Ojalá pudiera marcar esto como la respuesta seleccionada! – Nigel

+1

¡De nada! Es una pena que esta pregunta sea tan antigua, pero espero que la respuesta aún pueda ser útil :) –

6

Esta es una vieja pero tiene un montón de vista, así que decidí añadir mi solución aquí también.

Estoy haciendo uso de la función .delegate de JQuery para crear una implementación de enlace tardía que lo liberará de la obligación de utilizar el evento loadComplete.

Apenas añada el siguiente:

$(document).delegate('#myGrid .jqgrow td input', 'click', function() { alert('aaa'); }); 

Esto se unirán tarde que manejador a cada casilla de verificación que está en las filas de la cuadrícula. Puede tener un problema aquí si tiene más de una columna de casilla de verificación.

+0

+1 a usted, buen consejo! –

+0

¿Cómo manejarías el caso donde hay más de una columna de casilla de verificación en cada fila? – d512

+0

@ user1334007 Realmente depende de lo que esté haciendo.Si está utilizando la funcionalidad de edición en línea de la cuadrícula, puede utilizar lo anterior e identificar cuál fue cliqueado obteniendo su ID. De manera predeterminada, jqGrid establece la identificación de la casilla de verificación como "[rowid] _ [colname]". Entonces, desde el ID de la casilla de verificación podrá saber en qué fila/columna está la casilla de verificación. – AlexCode

3

que tenían el mismo problema y supongo que he encontrado una buena solución para manejar casilla clic inmediatamente. La idea principal es activar el método editCell cuando el usuario hace clic en la casilla de verificación no editable. Aquí está el código:

 jQuery(".jqgrow td").find("input:checkbox").live('click', function(){ 
      var iRow = $("#grid").getInd($(this).parent('td').parent('tr').attr('id')); 
      var iCol = $(this).parent('td').parent('tr').find('td').index($(this).parent('td')); 
      //I use edit-cell class to differ editable and non-editable checkbox 
      if(!$(this).parent('td').hasClass('edit-cell')){ 
            //remove "checked" from non-editable checkbox 
       $(this).attr('checked',!($(this).attr('checked'))); 
         jQuery("#grid").editCell(iRow,iCol,true); 
      } 
    }); 

Excepto esto, usted debe definir los eventos para la cuadrícula:

  afterEditCell: function(rowid, cellname, value, iRow, iCol){ 
      //I use cellname, but possibly you need to apply it for each checkbox  
       if(cellname == 'locked'){ 
       //add "checked" to editable checkbox 
        $("#grid").find('tr:eq('+iRow+') td:eq('+iCol+') input:checkbox').attr('checked',!($("#regions").find('tr:eq('+iRow+') td:eq('+iCol+') input:checkbox').attr('checked'))); 
          //trigger request 
        jQuery("#grid").saveCell(iRow,iCol); 
       } 
      }, 

      afterSaveCell: function(rowid, cellname, value, iRow, iCol){ 
       if(cellname == 'locked'){ 
        $("#grid").find('tr:eq('+iRow+') td:eq('+iCol+')').removeClass('edit-cell'); 
       } 
      }, 

Entonces su casilla enviará solicitudes de edición cada vez que el usuario hace clic en él.

2

Tengo una función de envío que envía todas las filas de la cuadrícula al servidor web.

que resuelven este problema utilizando este código:

var checkboxFix = []; 
$("#jqTable td[aria-describedby='columnId'] input").each(function() { 
     checkboxFix.push($(this).attr('checked')); 
}); 

Entonces mezclado con valores de GOT desde el código de abajo.

$("#jqTable").jqGrid('getGridParam', 'data'); 

Espero que ayude a alguien.

+0

Gracias Richard, pero encontré que esto no funcionó del todo. Mi casilla de verificación está en la primera columna de mi jqGrid, pero si un usuario hace clic dentro de una celda en esa primera columna, pero no en la casilla de verificación, este código activaría incorrectamente la función "el valor de la casilla de verificación ha cambiado". Lo que funcionó para mí fue esto: $ ('# jqGrid'). On ('change', ': checkbox', function (e) {}); –

0

mejor solución:

<script type="text/javascript"> 
    var boxUnformat = function (cellvalue, options, cell) { return '-1'; }, 
     checkboxTemplate = {width:40, editable:true, 
      edittype: "checkbox", align: "center", unformat: boxUnformat, 
      formatter: "checkbox", editoptions: {"value": "Yes:No"}, 
      formatoptions: { disabled: false }}; 
    jQuery(document).ready(function($) {   
     $(document).on('change', 'input[type="checkbox"]', function(e){ 
      var td = $(this).parent(), tr = $(td).parent(), 
       checked = $(this).attr('checked'), 
       ids = td.attr('aria-describedby').split('_'), 
       grid = $('#'+ids[0]), 
       iRow = grid.getInd(tr.attr('id')); 
       iCol = tr.find('td').index(td); 
      grid.editCell(iRow,iCol,true); 
      $('input[type="checkbox"]',td).attr('checked',!checked); 
      grid.saveCell(iRow,iCol); 
     }); 
    }); 
</script> 

En su colModel:

... 
{name:'allowAccess', template: checkboxTemplate}, 
... 
Cuestiones relacionadas