【问题标题】:Hide Grouping Heading in jqgrid if every row inside it is hidden如果隐藏其中的每一行,则在 jqgrid 中隐藏分组标题
【发布时间】:2011-10-19 19:49:57
【问题描述】:

这是 Oleg 已回答的 this question 的延续。

我有 2 个配置文件。

我比较它们是否相等,所以我有两个选项,如图所示(单选按钮)a。查看所有记录,b。查看差异

选项 a。 网格显示所有行,唯一的变化是不相等的值(在 JSON 中由 isEqual=false 标识)它们的颜色不同。

选项b中。

如果对应的行不相等(在 JSON 中由 isEqual=false 标识),则更改网格中的行颜色并且不显示相等(在 JSON 中由 isEqual=true 标识)的行值(因为这是 option b. 查看差异。所以现在在某些配置(json)中,Product(分组)的所有行都相等(即isEqual=true),所有行都隐藏在这些行之下,我想如果行内的所有行都被隐藏,那么分组也不应该是可见的。

例如:如果Product 分组隐藏了所有行,那么即使Product 分组也应该被隐藏

Json 的一小部分

{
"response": [
{
  "id": "1",
  "elementName": "A",
  "category": "System",
  "subCategory": "Environment",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "firstValue": "5242880",
      "secondValue": "5242880"
    }
  ]
},

{
  "id": "23",
  "elementName": "TERM",
  "category": "System",
  "subCategory": "Environment",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "firstValue": "xterm",
      "secondValue": "xterm"
    }
  ]
},

{
  "id": "33",
  "elementName": "bitmode",
  "category": "Product",
  "subCategory": "Product",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "bitmode",
      "firstValue": "file: cannot open /home/asimon/java/AIXJAVA/java/bin/libssaiok.so\u000a",
      "secondValue": "file: cannot open /home/asimon/java/AIXJAVA/java/bin/libssaiok.so\u000a"
    }
  ]
},

{
  "id": "36",
  "elementName": "coredump - hard",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "hard",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "37",
  "elementName": "coredump - soft",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "soft",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "38",
  "elementName": "cpuspeed",
  "category": "System",
  "subCategory": "System",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "cpuspeed",
      "firstValue": " 4204 \u000a",
      "secondValue": " 4204 \u000a"
    }
  ]
},
{
  "id": "39",
  "elementName": "data - hard",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "hard",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "40",
  "elementName": "data - soft",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "soft",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
}
{
  "id": "46",
  "elementName": "machine",
  "category": "System",
  "subCategory": "System",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "machine",
      "firstValue": "000CE082D900\u000a",
      "secondValue": "000CE082D900\u000a"
    }
  ]
},
{
  "id": "47",
  "elementName": "maxfilesperproc",
  "category": "System",
  "subCategory": "Kernel Parameters",
  "isEqual": false,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "maxfilesperproc",
      "firstValue": " 8192\u000a",
      "secondValue": " 2000\u000a"
    }
  ]
},
{
  "id": "48",
  "elementName": "maxthreadsperproc",
  "category": "System",
  "subCategory": "Kernel Parameters",
  "isEqual": false,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "maxthreadsperproc"
    }
  ]
},
{
  "id": "49",
  "elementName": "memory - hard",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "hard",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "50",
  "elementName": "memory - soft",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": false,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "soft",
      "firstValue": "32768 ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "51",
  "elementName": "mempagesize",
  "category": "System",
  "subCategory": "Kernel Parameters",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "mempagesize",
      "firstValue": "4096\u000a",
      "secondValue": "4096\u000a"
    }
  ]
},
{
  "id": "52",
  "elementName": "nofiles - hard",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "hard",
      "firstValue": "unlimited ",
      "secondValue": "unlimited "
    }
  ]
},
{
  "id": "53",
  "elementName": "nofiles - soft",
  "category": "System",
  "subCategory": "Userlimit",
  "isEqual": false,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "soft",
      "firstValue": "8192 ",
      "secondValue": "2000 "
    }
  ]
},
{
  "id": "54",
  "elementName": "numberofcpu",
  "category": "System",
  "subCategory": "System",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "numberofcpu",
      "firstValue": " 2\u000a",
      "secondValue": " 2\u000a"
    }
  ]
},
{
  "id": "55",
  "elementName": "osname",
  "category": "System",
  "subCategory": "System",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "osname",
      "firstValue": "AIX\u000a",
      "secondValue": "AIX\u000a"
    }
  ]
},
{
  "id": "56",
  "elementName": "release",
  "category": "System",
  "subCategory": "System",
  "isEqual": true,
  "isPrasentinXml1": true,
  "isPrasentinXml2": true,
  "isPrasentinXml3": false,
  "attribute": [
    {
      "name": "release",
      "firstValue": "1\u000a",
      "secondValue": "1\u000a"
    }
  ]
}

],
"xls_path": "\\csm\\files\\comparefiles\\compare_output.xls"
}

代码

$('#compareContent').empty();
        $('<div id="compareParentDiv" width="100%">'+
          '<table id="list2" cellspacing="0" cellpadding="0"></table>'+
                '<div id="gridpager3"></div></div>')
        .appendTo('#compareContent');

        $("#compareParentDiv").hide();

        var gridDiff = $("#list2");
        gridDiff.jqGrid({
            datastr: compareData,
            datatype: "jsonstring",
            colNames: ['KeyName', 'SubCategory', starheader, header1,'isEqual'],
            colModel: [
                { name: 'elementName', index: 'elementName', key: true, width: 120 },
                { name: 'subCategory', index: 'subCategory', width: 1 },
                { name: 'firstValue', index: 'firstValue', width: 310, jsonmap:'attribute.0.firstValue' },
                { name: 'secondValue', index: 'secondValue', width: 310,jsonmap:'attribute.0.secondValue' },
                { name: 'isEqual', index: 'isEqual', width: 1,hidden:true}
            ],
            pager: '#gridpager3',
            rowNum:50,
            scrollOffset:1,
            //viewrecords: true,
            jsonReader: {
                repeatitems: false,
                page: function(){return 1;},
                root: "response"
            },
            //rownumbers: true,

            height: '320',
            autowidth:true,
            grouping: true,

            groupingView: {
                groupField: ['subCategory'],
                groupOrder: ['desc'],
                groupDataSorted : true,
                groupColumnShow: [false],
                //groupCollapse: true,
                groupText: ['<b>{0}</b>']

            },

            loadComplete: function() {
                if (this.p.datatype !== 'local') {
                    setTimeout(function () {
                       gridDiff.trigger('reloadGrid');
                   }, 0);
                } else {
                    $("#compareParentDiv").show();
                }

                var i, names=this.p.groupingView.sortnames[0], l = names.length;
                 data = this.p.data, rows = this.rows, item;

                for (i=0;i<l;i++) {
                    if ($.inArray(names[i],grouping) >= 0) {
                        $(this).jqGrid('groupingToggle',this.id+"ghead_"+i);

                        $(rows.namedItem(this.id+"ghead_"+i)).find("span.ui-icon").click(function(){
                            var len = data.length, iRow;
                            for (iRow=0;iRow<len;iRow++) {
                                item = data[iRow];
                                if (item.isEqual) {
                                    $(rows.namedItem(item._id_)).hide();
                                }
                            }
                        });

                    } else {
                        // hide the grouping row
                        $('#'+this.id+"ghead_"+i).hide();
                    }
                    //console.info($('#'+this.id+"ghead_"+i));
                }

                /*var i, names=this.p.groupingView.sortnames[0], l = names.length,
                data = this.p.data, rows = this.rows, item;
                for (i=0;i<l;i++) {
                    if (names[i]==='Environment') {
                        $(this).jqGrid('groupingToggle',this.id+"ghead_"+i);
                        $(rows.namedItem(this.id+"ghead_"+i)).find("span.ui-icon").click(function(){
                            var len = data.length, iRow;
                            for (iRow=0;iRow<len;iRow++) {
                                item = data[iRow];
                                if (item.isEqual) {
                                    $(rows.namedItem(item._id_)).hide();
                                }
                            }
                        });
                    } else {
                        // hide the grouping row
                        $('#'+this.id+"ghead_"+i).hide();
                    }
                }*/

                var i, names=this.p.groupingView.sortnames[0], l = names.length,
                data = this.p.data, rows = this.rows, item; 

                l = data.length;
                for (i=0;i<l;i++) {
                    item = data[i];
                    if (!item.isEqual) {
                        $(rows.namedItem(item._id_))
                            .css({
                                "background-color": "#FFE3EA",
                                "background-image": "none"
                            });
                    } else {
                        $(rows.namedItem(item._id_)).hide();
                    }
                }
            }
        });
        gridDiff.jqGrid('navGrid', '#gridpager3', { add: false, edit: false, del: false, search: false, refresh: false });
        gridDiff.jqGrid('navButtonAdd',"#gridpager3",{caption:"Toggle",title:"Toggle Search Toolbar", buttonicon :'ui-icon-pin-s',
            onClickButton:function(){
                gridDiff[0].toggleToolbar();
            } 
        });
        gridDiff.jqGrid('navButtonAdd',"#gridpager3",{caption:"Clear",title:"Clear Search",buttonicon :'ui-icon-refresh',
            onClickButton:function(){
                gridDiff[0].clearToolbar();
            } 
        });
        gridDiff.jqGrid('filterToolbar',
                {stringResult: true, searchOnEnter: false, defaultSearch: 'cn'});

【问题讨论】:

    标签: jquery jqgrid


    【解决方案1】:

    我建议您稍微更改在loadComplete 处理程序中枚举网格行的方式。我建议以here 描述的方式枚举所有网格行。

    具有 'jqgfirstrow' 类的行将仅用于设置列的宽度。应该跳过它。

    具有 'jqgroup' 类的行是分组行。行的 id 将由网格 id(&lt;table&gt; 元素的 id)、文本 'ghead_' 和网格参数 groupingView.sortnames[0] 中的索引构成,它们表示组的排序名称。

    典型的数据行是具有“jqgrow”类的网格行。您应该检查行数据的isEqual 属性并隐藏或突出显示这些行。

    您将找到演示 here,它显示以下结果:

    下面我另外填写的loadComplete处理程序的新版本代码

    loadComplete: function () {
        var p = this.p, data = p.data, indexes = p._index,
            names = p.groupingView.sortnames[0], iName, idParts,
            rows = this.rows, cRows = rows.length, iRow, $row, rowData,
            previousGrouppigRow = null, hasHighlitedItem = false,
            lastCollaped = false,
            onGroupingExpand = function () {
                var $curRow = $(this).closest("tr.jqgroup").next();
                while ($curRow.hasClass('jqgrow')) {
                    rowData = data[indexes[$curRow[0].id]];
                    if (rowData.isEqual) {
                        $curRow.hide();
                    }
                    $curRow = $curRow.next();
                }
            };
    
        if (this.p.datatype !== 'local') {
            // reload grid to sort it
            setTimeout(function () {
                gridDiff.trigger('reloadGrid');
            }, 0);
            return; //we need not do anything now
        } else {
            parentContainer.show();
        }
    
        for (iRow = 0; iRow < cRows; iRow += 1) {
            $row = $(rows[iRow]);
            if ($row.hasClass('jqgroup')) {
                $row.find("span.ui-icon").click(onGroupingExpand);
                idParts = $row[0].id.split('ghead_');
                iName = idParts[idParts.length-1];
                if ($.inArray(names[iName], grouping) >= 0) {
                    // collape the grouping rows from the "grouping" array
                    gridDiff.jqGrid('groupingToggle', $row[0].id);
                    lastCollaped = true;
                }
                // the row is the group header
                if (previousGrouppigRow !== null && hasHighlitedItem === false) {
                    // the previous group has no highlited items
                    if (!lastCollaped) {
                        // collapse the group only if it is not already collaped
                        gridDiff.jqGrid('groupingToggle', previousGrouppigRow[0].id);
                    }
                    previousGrouppigRow.hide();
                }
                previousGrouppigRow = $row;
                hasHighlitedItem = false;
            } else if ($row.hasClass('jqgrow')) {
                rowData = data[indexes[$row[0].id]];
                if (!rowData.isEqual) {
                    hasHighlitedItem = true;
                    $row.css({
                        "background-color": "#FFE3EA",
                        "background-image": "none"
                    });
                } else {
                    $row.hide();
                }
            }
        }
        if (previousGrouppigRow !== null && hasHighlitedItem === false) {
            // the previous grout has no highlited items
            if (!lastCollaped) {
                gridDiff.jqGrid('groupingToggle', previousGrouppigRow[0].id);
            }
            previousGrouppigRow.hide();
        }
    }
    

    我建议你另外使用我在my previous answer末尾描述的建议。

    【讨论】:

    • 谢谢,如果用户比较相同的配置文件,它会得到所有的isEqual=false,所以没有显示任何组名,在这种情况下它应该显示一些消息。遇到这种情况怎么办?
    • @Abhishek Simon:The old answer 展示了两种方法可以告知用户没有数据可显示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 2020-02-11
    相关资源
    最近更新 更多