2011-11-28 4 views
5

J'utilise un filtre pour ma grille jqGrid, et les données sont dans des groupes, le premier état par défaut étant réduit. Si un utilisateur ouvre un groupe ou 2 (expansant les groupes), alors le filtre, la grille recharge les données, les filtre correctement, mais ensuite je perds l'état déployé des groupes ouverts par l'utilisateur. Y at-il un moyen de ne pas l'avoir, revenir à l'état par défaut de replié lors d'un filtre?jqGrid Groupement d'état lors du filtrage

Merci à l'avance.

Répondre

2

Je trouve votre question intéressante. Donc +1 de moi. J'ai fait une démo qui montre comment mettre en œuvre vos exigences.

L'idée principale de la mise en œuvre est la même que dans the answer. Je suggère simplement de maintenir l'état des groupes étendus dans un tableau expandedGroups. J'utilise le rappel onClickGroup ajouté dans jqGrid 4.0.0 (voir here). À l'intérieur du rappel loadComplete j'essaie d'étendre tous les éléments du tableau expandedGroups.

L'avantage de l'implémentation est que l'état déployé ne disparaît pas pendant la pagination, le tri et le filtrage.

La démo que vous pouvez voir here. Ci-dessous le code de la démo:

var $grid = $("#list"), expandedGroups = []; 

$grid.jqGrid({ 
    // ... some jqGrid parameters 
    grouping: true, 
    groupingView: { 
     groupField: ['name'], 
     groupCollapse: true, 
     groupDataSorted: true 
    }, 
    onClickGroup: function (hid, collapsed) { 
     var idPrefix = this.id + "ghead_", id, groupItem, i; 
     if (hid.length > idPrefix.length && hid.substr(0, idPrefix.length) === idPrefix) { 
      id = hid.substr(idPrefix.length); 
      groupItem = this.p.groupingView.sortnames[0][id]; 
      if (typeof (groupItem) !== "undefined") { 
       i = $.inArray(expandedGroups[i], groups); 
       if (!collapsed && i < 0) { 
        expandedGroups.push(groupItem); 
       } else if (collapsed && i >= 0) { 
        expandedGroups.splice(i, 1); // remove groupItem from the list 
       } 
      } 
     } 
    }, 
    loadComplete: function() { 
     var $this = $(this), i, l, index, groups = this.p.groupingView.sortnames[0]; 
     for (i = 0, l = expandedGroups.length; i < l; i++) { 
      index = groups.indexOf(expandedGroups[i]); 
      if (i >= 0) { 
       $this.jqGrid('groupingToggle', this.id + 'ghead_' + index); 
      } 
     } 
    } 
}); 
$grid.jqGrid('navGrid', '#pager', {add: false, edit: false, del: false}, {}, {}, {}, 
    {multipleSearch: true, multipleGroup: true, closeOnEscape: true, showQuery: true, 
     closeAfterSearch: true}); 

MISE À JOUR: Module de regroupement jqGrid sont modifiés dans de nombreuses régions depuis ma première réponse. La démo modifiée peut trouver here. La partie la plus importante du code utilisé, on peut voir ci-dessous

grouping: true, 
groupingView: { 
    groupField: ["invdate"], 
    groupCollapse: true, 
    groupDataSorted: true 
}, 
onClickGroup: function (hid, collapsed) { 
    var idPrefix = this.id + "ghead_", i, groupid, 
     $this = $(this), 
     groups = $(this).jqGrid("getGridParam", "groupingView").groups, 
     l = groups.length; 

    if (!inOnClickGroup) { 
     inOnClickGroup = true; // set to skip recursion 
     for (i = 0; i < l; i++) { 
      groupid = idPrefix + groups[i].idx + "_" + i; 
      if (groupid !== hid) { 
       $this.jqGrid("groupingToggle", groupid); 
      } 
     } 
     inOnClickGroup = false; 
    } 
} 

La inOnClickGroup variables sont définies dans le périmètre extérieur.

+0

Merci beaucoup, cela aurait pris un peu de temps pour travailler ceci, mais mon expérience est limitée à partir de ce noyau. Assez simple, mais quand tout le monde exploite ses spécialités, cela aide la communauté. Merci d'avoir économisé mon temps, j'espère pouvoir aider les autres de la même manière. –

+0

@ D-S: Vous êtes les bienvenus! – Oleg

+0

Bonne question et bonne réponse! – FastTrack

Questions connexes