2011-11-28 11 views
5

私のjqGridグリッドにフィルタを使用しています。データはグループ化されており、デフォルトでは折りたたまれています。ユーザーがグループまたは2(グループを拡張する)を開くと、フィルタが実行され、グリッドによってデータが再読み込みされ、正しくフィルタリングされますが、ユーザーが開いたグループの展開状態が失われます。それを持っていない方法はありますか?フィルタを実行するときに折り畳まれたデフォルトの状態に戻って切り替えますか?jqGridフィルタリング時の状態のグループ化

ありがとうございました。

答えて

2

あなたの質問は面白いです。だから+1。私はあなたの要件を実装する方法を示すデモを作成しました。

実装の主な考え方はthe answerと同じです。拡張グループの状態を配列expandedGroupsに保持することをお勧めします。私はonClickGroupコールバックをjqGrid 4.0.0で追加しました(here参照)。 loadCompleteコールバックの中で、配列expandedGroupsからすべての項目を展開しようとしました。

利点は、ページング、ソート、およびフィルタ処理中に展開状態が消えないことです。

デモはhereです。デモからコードで下記

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

が更新:jqGridのグループ化モジュールは、私のオリジナルの答え以来、多くの部分で変更されています。修正されたデモはhereです。コードの最も重要な部分は、1つの外側のスコープで定義され

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

可変inOnClickGroup下に見ることができました。

+0

ありがとうございました、これは少し時間がかかりましたが、私の経験はこのコアからは限られています。非常にストレートですが、誰もが専門家を活用すると、コミュニティを支援します。私の時間を節約してくれてありがとう、私は同じように他の人を助けることを願っています。 –

+0

@ D-S:ようこそ! – Oleg

+0

偉大な質問と素晴らしい答え! – FastTrack

関連する問題