2009-05-30 9 views
33

Lors de l'utilisation de jqGrid, comment forcer le chargement d'une cellule dans sa vue modifiable lors du chargement de la page, ainsi que lors d'un clic?jqGrid avec une colonne de case à cocher modifiable

Si vous configurez la 'cellule de modification' comme ci-dessous, la case à cocher n'apparaît que lorsque vous cliquez sur la cellule.

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

cellEdit:true, 

également à cliquer case à cocher, est-il un moyen d'envoyer un message AJAX au serveur instantanément plutôt que d'avoir à compter sur l'utilisateur en appuyant sur entrer?

Répondre

75

Pour permettre aux cases à cocher pour toujours être cliquable, utilisez la propriété de formatter case à cocher disabled:

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

Pour répondre à votre deuxième question, vous devrez configurer un gestionnaire d'événements pour les cases à cocher, de sorte que lorsque on clique sur une fonction pour appeler, par exemple, un POSTE AJAX au serveur. Voici un exemple de code pour vous aider à démarrer. Vous pouvez ajouter ceci à l'événement 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 réponse !! Merci, si c'était ma question, je te donnerais la tique. – Dan

+4

Fantastique! J'aimerais pouvoir marquer ceci comme la réponse choisie! – Nigel

+1

De rien! C'est une honte que cette question soit si ancienne, mais j'espère que la réponse peut toujours être utile :) –

6

C'est un ancien, mais a beaucoup de vue alors j'ai décidé d'ajouter ma solution ici aussi. J'utilise la fonction .delegate de JQuery pour créer une implémentation de liaison tardive qui vous libère de l'obligation d'utiliser l'événement loadComplete.

il suffit d'ajouter les éléments suivants:

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

Cela se lier tard ce gestionnaire à chaque case à cocher qui se trouve sur les lignes de la grille. Vous pouvez rencontrer un problème si vous avez plus d'une colonne de case à cocher.

+0

+1 pour vous, bonne astuce! –

+0

Comment gérez-vous le cas où il y a plus d'une colonne de case à cocher dans chaque ligne? – d512

+0

@ user1334007 Cela dépend vraiment de ce que vous faites.Si vous utilisez la fonctionnalité d'édition en ligne de la grille, vous pouvez toujours utiliser ce qui précède et identifier lequel a été cliqué en obtenant son ID.Par défaut, jqGrid définit l'ID de la case à cocher comme "[rowid] _ [colname]" Ainsi, à partir de l'ID de la case à cocher, vous serez en mesure de savoir sur quelle ligne/colonne la case à cocher est. – AlexCode

3

J'ai eu le même problème et je suppose que j'ai trouvé une bonne solution pour gérer case à cocher, cliquez immédiatement. L'idée principale est de déclencher la méthode editCell lorsque l'utilisateur clique sur la case à cocher non éditable. Voici le code:

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

Sauf cela, vous devez définir des événements pour votre réseau:

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

Ensuite, votre case à cocher envoyer des demandes de modification à chaque fois que l'utilisateur clique dessus.

2

J'ai une fonction de soumission qui envoie toutes les lignes de la grille au serveur web.

Je résolu ce problème en utilisant ce code:

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

Ensuite, je mélange avec des valeurs obtenu à partir du code ci-dessous.

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

J'espère que cela aide quelqu'un.

+0

Merci Richard, mais j'ai trouvé que ça ne marchait pas vraiment. Ma case est dans la 1ère colonne de mon jqGrid, mais si un utilisateur clique dans une cellule de cette 1ère colonne, mais pas sur la case elle-même, alors ce code déclenchera incorrectement la fonction "checkbox value has changed". Ce qui fonctionnait pour moi était le suivant: $ ('# jqGrid'). On ('change', ': checkbox', fonction (e) {}); –

0

meilleure solution:

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

Dans votre colModel:

... 
{name:'allowAccess', template: checkboxTemplate}, 
... 
Questions connexes