2011-11-28 9 views
5

Sto utilizzando un filtro per la mia griglia jqGrid e i dati sono in gruppi, il primo stato predefinito è compresso. Se un utente apre un gruppo o 2 (espandendo i gruppi), allora fa il filtro, la griglia ricarica i dati, li filtra correttamente, ma poi perdo lo stato espanso dei gruppi che l'utente ha aperto. C'è un modo per non averlo, tornare allo stato predefinito di crollo quando si fa un filtro?jqGrid Stato di raggruppamento durante il filtraggio

Grazie in anticipo.

risposta

2

La tua domanda è interessante. Quindi +1 da me. Ho fatto una demo che mostra come implementare le tue esigenze.

L'idea principale dell'implementazione è la stessa di the answer. Suggerisco di mantenere lo stato dei gruppi espansi in un array expandedGroups. Uso la richiamata onClickGroup aggiunta in jqGrid 4.0.0 (vedere here). All'interno della callback loadComplete provo ad espandere tutti gli elementi dall'array expandedGroups.

Il vantaggio dell'implementazione è che lo stato espanso non scompare durante il paging, l'ordinamento e il filtraggio.

La demo è possibile vedere here. Qui di seguito nel codice dalla demo:

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

AGGIORNATO: Raggruppamento modulo di jqGrid vengono cambiati in molte parti dal momento che la mia risposta originale. La demo modificata può trovare here. La parte più importante del codice utilizzato si può vedere qui

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 variabile inOnClickGroup sono definiti in ambito esterno.

+0

Grazie mille, ci sarebbe voluto un po 'di tempo per funzionare, ma la mia esperienza è limitata da questo nucleo. Piuttosto semplice, ma quando tutti sfruttano le specialità, aiuta la comunità. Grazie per avermi salvato il mio tempo, spero di aiutare gli altri allo stesso modo. –

+0

@ D-S: sei il benvenuto! – Oleg

+0

Ottima domanda e ottima risposta! – FastTrack