不规则表,合并table中任何同列数据

包裹代码:

一、应用背景:

jQuery.fn.rowspan = function (colIdx) { //封装JQuery同列值相同合并小插件
        return this.each(function () {
            var that;
            $('tr', this).each(function (row) {
                $('td:eq(' + colIdx + ')', this).filter(':visible').each(function (col) {
                    if (that != null && $(this).html() == $(that).html()) {
                        rowspan = $(that).attr("rowSpan");
                        if (rowspan == undefined) {
                            $(that).attr("rowSpan", 1);
                            rowspan = $(that).attr("rowSpan");
                        }
                        rowspan = Number(rowspan) + 1;
                        $(that).attr("rowSpan", rowspan);
                        $(this).hide();
                    } else {
                        that = this;
                    }
                });
            });
        });
    }

  做项目的时候经常会有这种需求,比如让你罗列一下负有人士的正规化消息,要求是首先列列出人员姓名,第二列列出专业音信,当出现众三人士会有两个正经音信的时候,第一列的人口姓名就会重复出现,客户平时会问能不可能把它合并了哟?想Excel表这样多窘迫啊?这些本来可以兑现。

  调用形式:

二、实现模式:

$("#ceshi").rowspan(0); //.rowspan(0)从0即第一列开始
  1. 说明

  2纯js写法:

lovebet爱博体育官网,  我们把对行的联结的形式做个包装,这里会合世二种意况

function hb(){ 
var tab = document.getElementById("subtable"); 
var maxCol = 3, val, count, start; 
var ys=""; 
for(var col = maxCol-1; col >= 0 ; col--) { 
count = 1; 
val = ""; 
for(var i=0; i<tab.rows.length; i++){ 
if(val == tab.rows[i].cells[col].innerHTML){ 
count++; 
}else{ 
if(count > 1){ 
//合并 
start = i - count; 
if(ys=="#00FFFF"){ 
ys="#EEEE00"; 
}else{ 
ys="#00FFFF"; 
} 
tab.rows[start].cells[col].rowSpan = count; 
tab.rows[start].cells[1].style.backgroundColor=ys;//改变颜色 
// ys="#EEEE00"; 
// tab.rows[i].cells[1].style.backgroundColor="#00FFFF";//改变颜色绿色 
for(var j=start+1; j<i; j++){ // 
tab.rows[j].cells[col].style.display = "none"; 
tab.rows[j].removeChild(tab.rows[j].cells[col]); 
} 
count = 1; 
} 
val = tab.rows[i].cells[col].innerHTML; 
} 
} 

if(count > 1 ){ //合并,最后几行相同的情况下 
start = i - count; 
tab.rows[start].cells[col].rowSpan = count; 
for(var j=start+1; j<i; j++) { 
tab.rows[j].removeChild(tab.rows[j].cells[col]); 
} 
} 
} 
} 

    1)所要合并的列是非模板列

第一种艺术,仅用20行代码就可实现该意义,而且封装在jq库里面,其他页面可以间接调用。也就是说,其他页面只需一行代码就可实现该意义。即$("#ceshi").rowspan(0); 
比起率先种,第两种办法相比较复杂,而且会把tabel里面装有同一列都合并,不实用。而且要改成仅合并第一列的话也不太好实现。但是思路可以学学一下。

    2)所要合并的列是模板列 

2.
代码实现:

1)普通列

      /// <summary>
        /// Gridview列的合并(普通列,不包含模板列)
        /// 注意:1.GridView在绑定的时候进行分组和排序,才能让相同的行放在一起
        ///       2.方法应用的时机,应该在Gridview的DataBound事件中使用
        /// </summary>
        /// <param name="gv">需要合并的GridView对象</param>
        /// <param name="columnIndex">所要合并列的索引</param>
        public static void UnitCell(GridView gv, int columnIndex)
        {
            int i = 0;                  //当前行数
            string lastType = string.Empty;        //当前判断是否合并行对应列的值
            int lastCell = 0;           //判断最后一个相同值的行的索引
            if (gv.Rows.Count > 0)
            {
                lastType = gv.Rows[0].Cells[columnIndex].Text.ToString();
                gv.Rows[0].Cells[columnIndex].RowSpan = 1;
                lastCell = 0;
            }
            for (i = 1; i < gv.Rows.Count; i++)
            {
                if (gv.Rows[i].Cells[columnIndex].Text == lastType)
                {
                    gv.Rows[i].Cells[columnIndex].Visible = false;
                    gv.Rows[lastCell].Cells[columnIndex].RowSpan++;
                }
                else
                {
                    lastType = gv.Rows[i].Cells[columnIndex].Text.ToString();
                    lastCell = i;
                    gv.Rows[i].Cells[columnIndex].RowSpan = 1;
                }
            }
        }

2). 模板列:

/// <summary>
        /// Gridview列的合并(模板列)
        /// </summary>
        /// <param name="gv">需要合并的GridView对象</param>
        /// <param name="columnIndex">所要合并列的索引</param>
        /// <param name="lblName">模板列对象的ID</param>
        public static void UnitCell(GridView gv, int columnIndex, string lblName)
        {
            int i = 0;                  //当前行数
            string lastType = string.Empty;        //当前判断是否合并行对应列的值
            int lastCell = 0;           //判断最后一个相同值的行的索引
            if (gv.Rows.Count > 0)
            {
                lastType = (gv.Rows[0].Cells[columnIndex].FindControl(lblName) as Label).Text;
                gv.Rows[0].Cells[columnIndex].RowSpan = 1;
                lastCell = 0;
            }
            for (i = 1; i < gv.Rows.Count; i++)
            {
                if ((gv.Rows[i].Cells[columnIndex].FindControl(lblName) as Label).Text == lastType)
                {
                    gv.Rows[i].Cells[columnIndex].Visible = false;
                    gv.Rows[lastCell].Cells[columnIndex].RowSpan++;
                }
                else
                {
                    lastType = (gv.Rows[i].Cells[columnIndex].FindControl(lblName) as Label).Text.ToString();
                    lastCell = i;
                    gv.Rows[i].Cells[columnIndex].RowSpan = 1;
                }
            }
        }

3). 方法调用:

  方法调用的时机,应该是在GridView的DataBound事件中开展模式的调用。为啥要如此呢?答案很简单,我们平日会分页,这样是为着保证你分页之后,也就是页面跳转的也一页时合并仍旧有效。

相关文章