【问题标题】:jqGrid Grouping state when filteringjqGrid 过滤时的分组状态
【发布时间】:2011-11-28 18:30:50
【问题描述】:

我正在为我的 jqGrid 网格使用过滤器,并且数据是分组的,默认第一个状态为折叠状态。如果用户打开一个或 2 个组(扩展组),然后进行过滤,网格重新加载数据,正确过滤它,但随后我失去了用户打开的组的展开状态。有没有办法不用它,在进行过滤时切换回折叠的默认状态?

提前致谢。

【问题讨论】:

    标签: jqgrid filter grouping state


    【解决方案1】:

    我觉得你的问题很有趣。所以我+1。我做了一个演示,展示了如何实现您的要求。

    实现的主要思想与the answer中的相同。我建议将扩展组的状态保存在数组expandedGroups 中。我使用在 jqGrid 4.0.0 中添加的onClickGroup 回调(参见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 的分组模块自我最初的回答以来在许多方面都发生了变化。修改后的demo可以找到here。使用的代码中最重要的部分可以在下面看到

    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在外部范围内定义。

    【讨论】:

    • 非常感谢,这需要一些时间才能完成,但我的经验仅限于这个核心。很直接,但是当每个人都利用那里的专长时,它会帮助社区。感谢您节省了我的时间,我希望以同样的方式帮助其他人。
    • 好问题和好答案!
    • @Oleg 这仍然是最好的方法吗?我收到 this.p.groupingView.sortnames[0] is undefined 错误。
    • @Mark:jqGrid 自从我原来的回答以来发生了变化。 The demo 演示更新的演示代码。请参阅我的回答的已更新部分。
    • 非常好的答案,我从中得到了解决方案,非常感谢你
    猜你喜欢
    • 2017-03-26
    • 2015-06-22
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-07-21
    • 2017-07-28
    • 1970-01-01
    相关资源
    最近更新 更多