2010-04-30 4 views
5

J'essaie de désactiver la fonctionnalité sortablerows d'une grille. J'aimerais pouvoir activer/désactiver la fonctionnalité sortablerows. L'activation de la fonction est assez simple:jqGrid désactiver sortablerows

jQuery("#list").jqGrid('sortableRows', { 
    update: function(event, ui) { updateOrder() } 
}); 

Mais la désactivation de la fonction est avérée être un peu plus difficile. J'ai consulté les Intégrations de l'interface utilisateur où sortableRows est consigné par écrit dans le jqGrid Wiki:

www.trirand.com/jqgridwiki/doku.php?id=wiki:jquery_ui_methods

et a constaté que « La méthode est entièrement compatible avec le widget de tri de l'interface utilisateur jQuery. " Donc, je me suis aventuré hors de la documentation triables jQuery UI et trouvé ceci:

http://jqueryui.com/demos/sortable/

jQuery("#list").jqGrid('sortableRows', {disabled: true}); 

Le code ci-dessus désactive simplement les lignes. Donc, je me suis déplacé sur la méthode destroy:

jQuery("#list").jqGrid('sortableRows', {destroy: true}); 

mais cela ne fait rien. Basé sur la documentation, la méthode destroy semble être exactement ce dont j'ai besoin, alors peut-être que ma syntaxe est fausse mais je n'arrive pas à la faire fonctionner.

Est-ce que quelqu'un a de l'expérience avec ce même problème?

Répondre

8

Il m'a fallu un certain temps pour comprendre celui-ci mais je l'ai eu et c'est assez simple. Ceci est tout ce que vous devez faire:

$("#list tbody").sortable("destroy"); 

Mes instincts premiers à se tourner vers la documentation Sortable jQuery UI avaient raison sur. Ma syntaxe n'était pas. Je perçai le fichier JS jqGrid et trouvé ceci:

a("tbody:first", i).sortable(b) 

Ce qui m'a alors fait dans la bonne direction. Il semble que le tbody est l'axe de charnière de tout le désordre. Pas n'importe qui se soucie mais je pensais que je devrais partager au cas où quelqu'un d'autre a un problème similaire et ma solution ne leur convient pas à 100%.

Anywho, merci pour votre aide. Mission accomplie.

+0

Merci. J'aime votre approche car elle fait tout avec une ligne de code, mais sacrifie la granularité des lignes indépendantes d'Oleg. –

3

Vous devez définir une classe CSS factice comme

.unsortable{} 

puis appelez sortableRows méthode de jqGrid remplacer le paramètre par défaut items: '.jqgrow' avec

jQuery("#list").jqGrid('sortableRows', { items: '.jqgrow:not(.unsortable)'}); 

Maintenant, vous ne devez ajouter la classe « être triée » aux lignes , que vous ne voulez pas permettre d'être triable. Laissez-nous nous avons dans les lignes de la grille avec les identifiants 'C28011' et 'C28015'. Ensuite, pour ce faire, vous pouvez utiliser la méthode setRowData de jqGrid ou appelez addClass méthode de jQuery directement:

jQuery("#list").setRowData ('C28011', false, 'unsortable'); 
jQuery("#C28015",jQuery("#list")[0]).addClass('unsortable'); 

MISE À JOUR (ajouter un exemple de code): Après avoir lu votre commentaire, je pense que ce serait mieux si je poster ici un exemple de code:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head"> 
    <title>Demonstration of disabling sortableRows on some jqGrid rows</title> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 

    <link rel="stylesheet" type="text/css" href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/redmond/jquery-ui.css" /> 
    <link rel="stylesheet" type="text/css" href="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-3.6.5/css/ui.jqgrid.css" /> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script> 
    <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-3.6.5/js/i18n/grid.locale-en.js"></script> 
    <script type="text/javascript" src="http://www.ok-soft-gmbh.com/jqGrid/jquery.jqGrid-3.6.5/js/jquery.jqGrid.min.js"></script> 

    <style type="text/css"> 
     #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; } 
     #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; } 
     #sortable li span { position: absolute; margin-left: -1.3em; } 
     .unsortable {} 
    </style> 

    <script type="text/javascript"> 
    //<![CDATA[ 
     jQuery(document).ready(function() { 
      jQuery("#sortable").sortable({ items: 'li:not(.unsortable)'}); 
      jQuery("#sortable").disableSelection(); 

      jQuery("#sortrows").jqGrid({ 
       datatype: 'local', 
       colNames:['Inv No','Date', 'Client', 'Amount','Tax','Total','Notes'], 
       colModel:[ 
        {name:'id',index:'id', width:55}, 
        {name:'invdate',index:'invdate', width:90}, 
        {name:'name',index:'name asc, invdate', width:100}, 
        {name:'amount',index:'amount', width:80, align:"right"}, 
        {name:'tax',index:'tax', width:80, align:"right"}, 
        {name:'total',index:'total', width:80,align:"right"}, 
        {name:'note',index:'note', width:250, sortable:false} 
       ], 
       rowNum:10, 
       width:700, 
       rowList:[10,20,30], 
       pager: '#psortrows', 
       sortname: 'invdate', 
       viewrecords: true, 
       sortorder: "desc", 
       caption:"Sortable Rows Example" 
      }); 
      jQuery("#sortrows").jqGrid('sortableRows', { items: '.jqgrow:not(.unsortable)'}); 

      var myData = [ 
       {id: "11", invdate: "2007-10-06", name: "Client 1", amount: "600.00", tax:"120.00", total: "720.00", note: "not sortable"}, 
       {id: "9", invdate: "2007-10-06", name: "Client 1", amount: "200.00", tax:"40.00", total: "240.00", note: "not sortable"}, 
       {id: "5", invdate: "2007-10-05", name: "Client 3", amount: "100.00", tax:"0.00", total: "100.00", note: "not sortable"}, 
       {id: "7", invdate: "2007-10-05", name: "Client 2", amount: "120.00", tax:"12.00", total: "134.00", note: "no tax at all"}, 
       {id: "6", invdate: "2007-10-05", name: "Client 1", amount: "50.00", tax:"10.00", total: "60.00", note: ""}, 
       {id: "4", invdate: "2007-10-04", name: "Client 3", amount: "150.00", tax:"0.00", total: "150.00", note: "no tax"} 
      ]; 

      for (var i = 0; i < myData.length; i++) { 
       jQuery("#sortrows").addRowData(myData[i].id, myData[i]); 
      } 

      jQuery("#sortrows").setRowData ('11', false, 'unsortable'); 
      jQuery("#sortrows").setRowData ('9', false, 'unsortable'); 
      jQuery("#5",jQuery("#sortrows")[0]).addClass('unsortable'); 
     }); 
    //]]> 
    </script> 
</head> 

<body> 


<div class="demo"> 

<ul id="sortable"> 
    <li class="ui-state-default unsortable"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1 (not sortable)</li> 
    <li class="ui-state-default unsortable"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2 (not sortable)</li> 
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3 (sortable)</li> 
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4 (sortable)</li> 
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5 (sortable)</li> 
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6 (sortable)</li> 
    <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7 (sortable)</li> 
</ul> 

</div> 

<table id="sortrows"></table> 
<div id="psortrows"></div> 

</body> 
</html> 

Dans ce code, je l'utilise au début de fonctionnalité triables norme jQuery pour permettre sorte que les éléments sélectionnés. Que je fais la même chose à l'intérieur de jqGrid. Vous pouvez voir cet exemple travailler ici http://www.ok-soft-gmbh.com/jqGrid/sortableRows.htm. Donc, l'ajout d'une classe fictive "non-supportable" à une ligne permet de désactiver la fonctionnalité "triable". Suppression de ce commutateur de classe "triable". Vous pouvez le faire à tout moment pour les lignes sélectionnées de la grille ou pour tous (jQuery("tr",jQuery("#list")[0]).addClass('unsortable');).

La seule chose que vous devriez ne pas oublier: vous devez appeler setRowData ou addClass après les données ajoutées dans la grille, par exemple, à l'intérieur de loadComplete fonction de jqGrid.

MISE À JOUR 2: Voir the answer qui décrit comment désactiver le tri pour des lignes spécifiques de la grille.Il utilise les possibilités existant dans les versions plus récentes de jqGrid et de jQuery UI.

+0

Je vais faire un tourbillon. Je ne suis pas exactement la logique, en particulier la partie # C28015, mais tout vaut le coup d'essayer. – gurun8

+0

chaque '' a le même 'id' que vous définissez dans la ligne de vos données. Pour trouver '' avec 'id = 'C28015'' vous devriez utiliser le sélecteur'' # C28015''. Pour ne pas rechercher dans le document entier, vous pouvez effectuer une recherche uniquement dans le corps de la table. 'jQuery (" # list ")' pointe vers le corps de la table 'jQuery (" # liste ") [0]' est identique, mais en tant qu'élément DOM et non en tant qu'objet jQuery. Donc 'jQuery (" # C28015 ", jQuery (" # list ") [0]). AddClass ('unsortable')' ajouter une classe ''unsortable''' '' avec 'id =' C28015''. – Oleg

+0

@Joper: Pourriez-vous expliquer le contexte de votre question? Est-ce la question à ma réponse? Où j'ai utilisé cette déclaration? – Oleg

2

Comme gurun8 a écrit:

$("#list tbody").sortable("destroy"); 

Cela fonctionne très bien. Mais, si vous utilisez l'édition en ligne, vous pouvez faire

$("tbody:first","#list").enableSelection(); 

jqGrid sortableRows appelle la fonction disableSelection(), qui interdit la sélection d'un élément de formulaire dans la tbody de grille, empêchant ainsi l'édition en ligne appropriée.