2009-05-30 15 views
33

Quando si utilizza jqGrid, come si forza a caricare una cella nella visualizzazione modificabile sul caricamento della pagina e quando viene fatto clic?jqGrid con una colonna di casella modificabile

Se si imposta "Modifica cella" come di seguito, la casella di controllo viene visualizzata solo quando si fa clic sulla cella.

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

cellEdit:true, 

anche facendo clic su casella di controllo, c'è un modo di inviare un post AJAX al server immediatamente piuttosto che dover fare affidamento su l'utente preme entrare?

risposta

75

Per consentire le caselle di essere sempre click-in grado, utilizzare disabled proprietà del formattatore casella di controllo:

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

Per rispondere alla tua seconda domanda, si dovrà impostare un gestore di eventi per le caselle di controllo, in modo che quando si fa clic su una funzione, ad esempio, si invia un POST AJAX al server. Ecco alcuni esempi di codice per iniziare. È possibile aggiungere questa all'evento 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 Grande risposta !! Grazie, se fosse la mia domanda, ti darei il segno di spunta. – Dan

+4

Fantastico! Vorrei poter contrassegnare questo come la risposta selezionata! – Nigel

+1

Prego! È una vergogna che questa domanda sia così vecchia, ma spero che la risposta possa ancora essere utile :) –

6

Questo è un vecchio ma ha un sacco di vista così ho deciso di aggiungere la mia soluzione anche qui.

Sto facendo uso della funzione .delegate di JQuery per creare un'implementazione di associazione tardiva che ti libererà dall'obbligo di utilizzare l'evento loadComplete.

Basta aggiungere il seguente:

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

Ciò tardi legano che gestore per ogni casella di controllo che è sulle righe della griglia. Potresti avere un problema qui se hai più di una colonna di checkbox.

+0

+1 a te, bel consiglio! –

+0

Come gestiresti il ​​caso in cui c'è più di una colonna di checkbox in ogni riga? – d512

+0

@ user1334007 Dipende molto da cosa stai facendo.Se stai utilizzando la funzionalità di modifica in linea della griglia puoi ancora utilizzare quanto sopra e identificare quale è stato cliccato ottenendo il suo ID. Di default, jqGrid imposta l'ID della casella di controllo come "[rowid] _ [colname]". Quindi dall'ID della casella di controllo sarai in grado di sapere su quale riga/colonna si trova la casella di controllo. – AlexCode

3

Ho avuto lo stesso problema e suppongo che ho trovato una buona soluzione per gestire immediatamente casella di clic. L'idea principale è di attivare il metodo editCell quando l'utente fa clic sulla casella di controllo non modificabile. Ecco il codice:

 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); 
      } 
    }); 

Tranne questo, è necessario definire gli eventi per la griglia:

  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'); 
       } 
      }, 

Allora la vostra casella di controllo invierà modificare le richieste ogni volta quando l'utente fa clic su di esso.

2

Ho una funzione di invio che invia tutte le righe della griglia al server web.

ho risolto questo problema utilizzando questo codice:

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

Poi ho mescolato con i valori ottenuto dal codice qui sotto.

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

Spero che aiuti qualcuno.

+0

Grazie Richard, ma ho trovato che questo non ha funzionato. La mia casella di controllo si trova nella prima colonna del mio jqGrid, ma se un utente fa clic all'interno di una cella in quella prima colonna, ma non sulla casella di controllo stessa, questo codice attiva in modo errato la funzione "Il valore della casella di controllo è cambiato". Ciò che ha funzionato per me è stato questo: $ ('# jqGrid'). On ('cambia', ': checkbox', function (e) {}); –

0

Soluzione migliore:

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

Nel vostro colModel:

... 
{name:'allowAccess', template: checkboxTemplate}, 
... 
Problemi correlati