jqgrid分級表格合併

之前做過jqgrid的表格合併,但是隻是很簡單的相鄰內容相同就合併的邏輯,然後現在我要做一個分級的合併功能,就是說將列認爲的設置等級,只有上級相同的列名字相同才能合併。舉個例子,我先按日期,機器,班次排序,然後合併日期,機器,班次,如果只是簡單的相同內容就合併,可能會出現不同日期有着同一臺機器合併的可能。廢話不多說直接上代碼。

//gridName表名
//CellName需要合併的列名(多個用,號隔開)
//mainId主列名(多個用,號隔開,前面的等級更高)
function MergerStatistics(gridName, CellName, mainId) {
    //得到顯示到界面的id集合
    var mya = $("#" + gridName + "").getDataIDs();
    //當前顯示多少條
    var length = mya.length;
        var cellNames = CellName.split(",");
        var multilevel = [];
        if(!!mainId)
        	multilevel = mainId.split(",");
        var originRowCount = {};
        $.each(cellNames,function(i,n){
	    $("#" + gridName + "").find("tr td[aria-describedby="+gridName+"_"+n+"]").show();
        	originRowCount[n] = 1;
        });
    for (var n = 0; n < cellNames.length; n++) {
	    for (var i = 0; i < length; i++) {
	        //從上到下獲取一條信息
	        var before = $("#" + gridName + "").jqGrid('getRowData', mya[i]);
	        before["gridMainId"] = gridMainId(before,multilevel);
	        //定義合併行數
	        var rowSpanTaxCount = 1;
	        var rowCount = $.extend({},originRowCount);
	        for (j = i + 1; j <= length; j++) {
	            //和上邊的信息對比 如果值一樣就合併行數+1 然後設置rowspan 讓當前單元格隱藏
	            var end = $("#" + gridName + "").jqGrid('getRowData', mya[j]);
	            end["gridMainId"] = gridMainId(end,multilevel);
	            //判斷主列是否一致
                if (before[cellNames[n]] == end[cellNames[n]] && compareLevel(before,end,multilevel,cellNames[n])) {
                    rowSpanTaxCount++;
            		rowCount[cellNames[n]] = ++ rowCount[cellNames[n]];
                    $("#" + gridName + "").setCell(mya[j], cellNames[n], '', { display: 'none' });
    	                //$("#" + cellNames[n] + "" + mya[i] + "").attr("rowspan", rowSpanTaxCount);//最後合併需要合併的行與合併的行數
    	            
                } else {
                    break;
                }
	        }
 	        $("#"+ gridName + " tr:eq(" + (i+1) + ") td[aria-describedby="+gridName+"_"+cellNames[n]+"]").attr("rowspan", rowCount[cellNames[n]]);//最後合併需要合併的行與合併的行數
            rowSpanTaxCount = 1;
	    }
    }
}
//拼接所有主列的值
function gridMainId(rowData,multilevel){
   var gridMainId = "";
   for(var i in multilevel){
	   gridMainId += rowData[multilevel[i]]+";";
   }
   return gridMainId;
}
//比較主列是否一致
function compareLevel(before,end,multilevel,key){
   if(multilevel.length == 0)
	   return true;
   var level = multilevel.indexOf(key);
   var flag = true;
   if(level < 0){//如果合併列不屬於主列,那麼需要所有主列一致才能合併
	   if(before["gridMainId"] != end["gridMainId"])
		   flag = false;
   }else{
	   for(var i=0;i<level;i++){//如果合併列屬於主列,那麼需要更高的主列相等才能合併
		   if(before[multilevel[i]] != end[multilevel[i]]){
			   flag = false;
			   break;
		   }
	   }
   }
   return flag;
}

在表格生成以後調用一下MergerStatistics(gridName, CellName, mainId)就好了。比如jqgrid的loadComplete方法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章