2009-10-07 4 views
4

Quelle est la meilleure façon de sélectionner par programme toutes les lignes dans un jqGrid qui est défini sur multiselect?Sélectionner par programme toutes les lignes d'un jqGrid?

Le code peut parcourir une à la fois toutes les lignes et sélectionner chacune d'elles, mais la case à cocher dans l'en-tête de la grille n'est pas vérifiée. Je pensais juste à déclencher l'événement cliqué de la case à cocher de la ligne d'en-tête, mais cela ferait des suppositions à propos de l'implémentation de jqGrid sous-jacente. Il doit y avoir un meilleur moyen ...

Merci d'avance!

Répondre

6

Si vous sélectionnez toutes les lignes d'un jqGrid multisélect en cliquant manuellement sur chacune d'elles, la case à cocher de l'en-tête n'est pas vérifiée, donc je ne m'attendrais pas forcément à ce que cela se produise vous utilisez setSelected (rowid, true) pour chaque ligne, c'est l'équivalent de cliquer sur chacun, car le paramètre "true" indique que l'événement cliqué doit être déclenché pour chacun d'entre eux). En fait, si vous voulez que tous les fichiers soient cochés et que vous voulez cocher la case dans l'en-tête, il peut être préférable de déclencher l'événement clicked. Si vous creusez dans le code source et regardez ce qui se passe lorsque vous cliquez sur la case à cocher, il s'agit simplement de faire défiler toutes les lignes et de les définir comme sélectionnées, donc je ne pense pas que vous fassiez beaucoup mieux .

+0

Merci pour votre temps, il semble que je me contenterai aller avec cette approche alors. –

2

Bizarrement, il ne semble pas y avoir une telle fonction dans l'API. La sélection par programme de la case à cocher «Sélectionner tout» déclenche le code Sélectionner tout (que vous pouvez trouver dans grid.base.js, à partir de la ligne 1053. Contrairement à la sélection manuelle des lignes individuelles, l'événement onSelectAll se déclenche correctement. Cela fait des hypothèses, mais pas autant que l'inverse:/

+1

On pourrait penser qu'une telle fonction ferait partie de l'API - quelque chose à suggérer pour une future version, je suppose. –

1

Oui, il est vrai que ce n'est pas une approche très conventionnelle, et c'est essentiellement ce que vous avez dit que vous envisagiez de faire, mais j'ai trouvé que c'était la façon la plus simple pour obtenir toutes les lignes sélectionnées et ont également la case à cocher en-tête sélectionné:

var grid = $("#my_grid"); 
    grid.resetSelection(); 
    $('#cb_my_grid').click(); 
    var ids = grid.getDataIDs(); 
    for (var i=0, il=ids.length; i < il; i++) 
    grid.setSelection(ids[i], false); 

Je suppose que les lignes ne sont pas sélectionnés lorsque la case d'en-tête est cliqué par programme en raison de la jqGrid im sous-jacente plementation, comme vous l'avez dit? Je ne sais pas comment ça fonctionne en dessous, mais cela semble fonctionner pour moi en ce moment. La principale raison pour laquelle je veux m'assurer que la case d'en-tête est sélectionnée dans mes grilles est que l'utilisateur peut inconsciemment déterminer que oui, toutes les lignes de la grille sont définitivement sélectionnées (y compris celles non visibles sous le parchemin actuel voir), et ne pas avoir à cliquer sur la case à cocher d'en-tête juste pour s'assurer.

@Craig - Je vais devoir essayer votre méthode, il semble plus simple et plus raisonnable

1

sélectionner la case à cocher Programmatically « tout sélectionner » déclenche pas toujours la sélection tout le code. Nous devons définir l'attribut "checked" avant, donc la branche correcte de la méthode select all sera choisie. Voici un code que j'ai utilisé avec la version de grille 3.8.1:

$("#cb_my_grid").attr("checked", true); 
$("#cb_my_grid").trigger('click'); 
$("#cb_my_grid").attr("checked", true); 
+0

Devrait probablement utiliser '.prop (" checked ", true)' au lieu de '.attr (" checked ", true)' –

3

Je pense que rien n'est impossible, Ceci est une solution alternative. Vous pouvez parcourir toutes les lignes une à la fois et sélectionner chacune d'elles, puis la case à cocher dans l'en-tête de la grille est vérifiée manuellement. Mais la case à cocher dans l'en-tête de grille n'est pas sélectionnée lorsqu'au moins une case à cocher n'est pas sélectionnée.

colNames : [ ,'<input type="checkbox" id="cbox" onclick="UI_PaxCheckin.checkBox(this,event)" />',..] 

UI_PaxCheckin.checkBox = function(obj,e) { 
e = e||event; 
e.stopPropagation? e.stopPropagation() : e.cancelBubble = true; 
var grid = $('#jqGridPax'); 
if(obj.checked == true){ 
    UI_PaxCheckin.multiSelectedFlightRowID = []; 
} 
for (var p = 0; p < grid[0].rows.length -1 ; p++) { 
    $('#chkIsSelected_' + p).prop('checked', obj.checked); 
    //manual checkbox click event function call 
} 
$('#cbox').prop('checked', obj.checked);} 
+1

Il semble que vous réinventiez la roue avec le type d'entrée, cependant. Pourquoi ne pas simplement utiliser les cases à cocher intégrées dans la grille? –

+0

J'ai essayé l'option multi-sélection et multi-sélection manuelle. J'ai rencontré quelques difficultés dans l'option multi-sélection. comme: le déclenchement de la case à cocher de l'en-tête de l'événement cliqué n'est pas coché, il est très difficile d'optimiser l'option multisélect à mon contexte (je veux appeler un événement quand la case à cocher est sélectionnée etc.) –

0

bien meilleure solution qui clique en fait la sélection toutes case

gridComplete: function(){ 
    $(this).jqGrid('resetSelection'); 
    $(this).closest(".ui-jqgrid").find(".ui-th-column:first .cbox").click(); 
} 

ou si votre ID de réseau est « myGrid »

$("#mygrid").jqGrid('resetSelection'); 
$("#cb_mygrid").click(); 
Questions connexes