lovebet爱博体育官网封装Jquery 合并table中任何同列数据。GridView实现某列中相同值合并(不规则表),类似Execl中效果。

包装代码:

同样、应用背景:

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写法:

  我们管对行的联之法做个包装,这里见面出现个别种植情景

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事件中展开艺术的调用。为什么而这样为?答案非常简短,我们常常会分页,这样是为着确保你分页之后,也尽管是页面跳转的吧如出一辙页时合并仍然有效。

相关文章