这是Oleg回答this question的延续。
我有2个配置文件。
我比较它们是否相等,所以我有两个选项,如图像所示(单选按钮) a。查看所有记录,b。查看差异
选项a。
网格显示所有行,只有更改的是不相等的值(在JSON中由isEqual=false
标识)它们的颜色不同。
在选项b。
中如果相应的行不相等(在JSON中由isEqual=false
标识),则网格中的行颜色会发生变化,并且不会显示相等(由JSON中的isEqual=true
标识)行值(因为这是选项b。查看差异。所以现在在某些配置(json)中产品(分组)所有行都相等(即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'});
答案 0 :(得分:2)
我建议您稍微更改loadComplete
处理程序中枚举网格行的方式。我建议以here描述的方式枚举所有网格行。
具有'jqgfirstrow'类的行将仅用于设置列的宽度。应该跳过它。
具有'jqgroup'类的行是分组行。行的ID将根据网格id(<table>
元素的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末尾所述的建议。