2011-11-28 11 views
5

Używam filtru dla mojej siatki jqGrid, a dane są w grupach, domyślnie pierwszy stan zwinięty. Jeśli użytkownik otworzy grupę lub 2 (rozszerza grupy), to wykonuje filtr, siatka ponownie ładuje dane, filtruje je poprawnie, ale potem tracę rozwinięty stan grup otwartych przez użytkownika. Czy istnieje sposób, aby go nie mieć, powrócić do domyślnego stanu zwiniętego podczas filtrowania?jqGrid Stan grupowania podczas filtrowania

Dzięki z góry.

Odpowiedz

2

Twoje pytanie jest interesujące. Więc daj mi +1. Zrobiłem demo, które pokazuje, jak wdrożyć swoje wymagania.

Główna idea wdrożenia jest taka sama jak w przypadku the answer. Proponuję po prostu przytrzymać stan rozwiniętych grup w tablicy expandedGroups. Używam callback onClickGroup dodany w jqGrid 4.0.0 (patrz here). Wewnątrz oddzwaniania loadComplete próbuję rozszerzyć wszystkie elementy z tablicy expandedGroups.

Zaletą wdrożenia jest to, że rozwinięty stan nie zniknie podczas stronicowania, sortowania i filtrowania.

Demo, które można zobaczyć here. Poniżej kod z 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}); 

AKTUALIZACJA: Grupowanie moduł jqGrid zmieniane są w wielu częściach od mojego pierwotnego odpowiedź. Zmodyfikowane demo można znaleźć here. Najważniejszą częścią kodu stosować można zobaczyć poniżej

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

Zmienna inOnClickGroup są zdefiniowane w ramach zewnętrznego.

+0

Dziękuję bardzo, zajęłoby to trochę czasu, aby pracować, ale moje doświadczenie jest ograniczone z tego rdzenia. Całkiem prosto, ale kiedy każdy wykorzystuje tamtejsze specjalności, pomaga społeczności. Dziękuję za oszczędność czasu, mam nadzieję pomóc innym w ten sam sposób. –

+0

@ D-S: Nie ma za co! – Oleg

+0

Świetne pytanie i wspaniała odpowiedź! – FastTrack