`
tipx
  • 浏览: 109187 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

Extjs 实现多行合并(rowspan)效果

阅读更多
还是一如既往的土方法

引用
声明:
  本效果的本质,只是用css去除边框而已,不包含分组功能。
  代码在IE6-8, FF3下测试通过
  代码依赖于Extjs 3.x


1.加入css样式
/*rowspan grid合并行效果*/
.rowspan-grid .x-grid3-body .x-grid3-row {
    border:none;
    cursor:default;
    width:100%;
}
.rowspan-grid .x-grid3-header .x-grid3-cell{
    /*border-left: 2px solid transparent;*//*ie6的transparent下显示黑色?*/
    border-left: 2px solid #fff;
}
.rowspan-grid .x-grid3-body .x-grid3-row{
    overflow: hidden;
    border-right: 1px solid #ccc;
}
.rowspan-grid .x-grid3-body .x-grid3-cell {
    border: 1px solid #ccc;
    border-top:none;
    border-right:none;
}
.rowspan-grid .x-grid3-body .x-grid3-cell-first {
    /*border-left: 1px solid transparent;*/
    border-left: 1px solid #fff;
}
.rowspan-grid .x-grid3-body .rowspan-unborder {
    /*border-bottom:1px solid transparent;*/
    border-bottom:1px solid #fff;
}
.rowspan-grid .x-grid3-body .rowspan {
    border-bottom: 1px solid #ccc;
}


2.引入Ext.ux.grid.RowspanView对象
    Ext.ns('Ext.ux.grid');
    /**
     * 实现grid的rowspan效果
     *  @author: tipx.iteye.com
     *
     *  1.在列模型里需要配置合并行的列中设置rowspan属性,如:{dataIndex:'xxx', header:'xxx', rowspan:3} //该列每三行合并一行
     *  2.为grid设置view属性 => view : new Ext.ux.grid.RowspanView()
     *  3.为grid设置cls属性 => cls : 'rowspan-grid'
     *  4.加入css样式
     */
    Ext.ux.grid.RowspanView = Ext.extend(Ext.grid.GridView, {
        constructor: function(conf) {
            Ext.ux.grid.RowspanView.superclass.constructor.call(this, conf);
        },
        // private
        //清除合并的行中,非第一行的数据
        cleanRenderer : function(column, value, metaData, record, rowIndex, colIndex, store) {
            var rowspan = column.rowspan;
            if(!Ext.isEmpty(rowspan) && rowspan !== 0){
                if(rowIndex % rowspan !== 0){
                    return '';
                }
            }
            return column.renderer(value, metaData, record, rowIndex, colIndex, store);
        },
        // private
        doRender : function(cs, rs, ds, startRow, colCount, stripe){
            var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount-1;
            var tstyle = 'width:'+this.getTotalWidth()+';';
            // buffers
            var buf = [], cb, c, p = {}, rp = {tstyle: tstyle}, r;

            //cmConfig列模型
            var cmConfig = this.cm.config, rowspans=[];
            for(var i = 0, len = cmConfig.length; i < len; i++){
                rowspans.push(Math.max((cmConfig[i].rowspan || 0), 0));
            }

            for(var j = 0, len = rs.length; j < len; j++){
                r = rs[j]; cb = [];
                var rowIndex = (j+startRow);
                for(var i = 0; i < colCount; i++){
                    c = cs[i];
                    p.id = c.id;
                    p.css = i === 0 ? 'x-grid3-cell-first ' : (i == last ? 'x-grid3-cell-last ' : '');
                    p.attr = p.cellAttr = "";
                    p.value = this.cleanRenderer(cmConfig[i], r.data[c.name], p, r, rowIndex, i, ds);
                    p.style = c.style;
                    if(Ext.isEmpty(p.value)){
                        p.value = "&#160;";
                    }
                    if(this.markDirty && r.dirty && typeof r.modified[c.name] !== 'undefined'){
                        p.css += ' x-grid3-dirty-cell';
                    }
                    //------------------------------------------------
                    //添加rowspan类,用样式实现合并行的效果
                    if(rowspans[i] !== 0){
                        //每rowspan行以及最后一行加上rowspan类,即加上border-bottom
                        if(j == (len-1) || (rowIndex+1) % rowspans[i] === 0){
                            p.css += ' rowspan';
                        }else{
                            p.css += ' rowspan-unborder';
                        }
                    }
                    //------------------------------------------------
                    cb[cb.length] = ct.apply(p);
                }
                var alt = [];
                if(stripe && ((rowIndex+1) % 2 === 0)){
                    alt[0] = "x-grid3-row-alt";
                }
                if(r.dirty){
                    alt[1] = " x-grid3-dirty-row";
                }
                rp.cols = colCount;
                if(this.getRowClass){
                    alt[2] = this.getRowClass(r, rowIndex, rp, ds);
                }
                rp.alt = alt.join(" ");
                rp.cells = cb.join("");
                buf[buf.length] =  rt.apply(rp);
            }
            return buf.join("");
        }
    });


3.创建grid
a. 创建列模型时,在需要合并行的列模型中加入配置:“rowspan:行数”(不含双引号)
{header: 'Company', dataIndex: 'company', rowspan:4}//本列每4行合并为1行

b. 创建grid时,为grid配置:“cls:'rowspan-grid',view: new Ext.ux.grid.RowspanView()”
// create the Grid
  var grid = new Ext.grid.GridPanel({
      title: 'Extjs实现行合并(rowspan)效果',
      store: store,
      sm:sm,
      cm:cm,
      stripeRows: true,
      cls: 'rowspan-grid', //******必须配置此样式
      view: new Ext.ux.grid.RowspanView() //****使用view
  });


4.预览效果



5.瑕疵
  由于ie6以外的浏览器的盒模型比较怪异(主因还是我自身不擅处理CSS),列头与数据列的边框有些对不齐(当前的效果已经是尽了最大努力了);

  由于“border-left: 2px solid transparent”中的transparent在ie6下显示黑色,本人对hack又不擅长(=。=都不知道自己到底擅长什么了),所以就干脆将transparent全部用白色替换了(效果会差一些),如果能直接对ie6进行hack的话,应该会完美一点

6.注意
  从效果图上可以看出,合并行的区域,只显示合并行中的第一行数据,但这并不是分组效果!而是通过view中的cleanRenderer方法将“第x个rowspan区域的非第一行数据”直接返回空串而已。并不是将相同的数据合并!


7.demo下载
见附件
  • 大小: 73.2 KB
9
0
分享到:
评论
5 楼 shouzhang1_2 2013-06-19  
不报错啊!可以用,谢谢
4 楼 gudujian6169 2012-06-13  
总是报Ext.ux.grid.RowspanView为空或不是对象咋办啊?
3 楼 zuyali 2011-10-25  
你好,我已经按照你说的做了,却报了一个错
column.renderer is not a function
return column.renderer(value, ..., record, rowIndex, colIndex,store);
rowspan.js (第 23 行)
2 楼 tipx 2011-08-16  
hldstruggle 写道
兄弟这合并单元格可做成动态的吗

只是纯粹修改样式而已,算是半动态吧,升级到Ext3.3后,基本不需要使用这种了吧,这种只能算是无奈之举。
1 楼 hldstruggle 2011-07-29  
兄弟这合并单元格可做成动态的吗

相关推荐

    extjs3合并表头 rowspan

    "rowspan"属性在HTML表格中被用来合并行,而在ExtJS 3中,它用于实现类似的功能,即在数据网格的表头中合并单元格,以创建更复杂的布局和更清晰的数据组织。 在ExtJS 3中,如果你需要合并表头,你可能会使用`Ext....

    extjs单元格合并

    EXTJS单元格合并是指在EXTJS GridPanel中实现单元格合并的功能。单元格合并可以使得GridPanel中的数据显示更加简洁和清晰。下面将详细介绍EXTJS单元格合并的实现方法。 一、加入CSS样式 在实现单元格合并时,需要...

    ExtJS GRID单元格合并

    同时,需要在CSS中定义`.merged-row`和`.merged-cell`类,以实现实际的合并效果,例如设置`rowspan`和`colspan`属性。这需要根据具体的业务需求进行调整。 在Grid.js文件中,可能包含了实现上述功能的具体代码实现...

    Extjs表格合并代码

    在本文中,我们将深入探讨如何在ExtJS框架中实现表格单元格的合并,以及解决不同浏览器间盒模型差异带来的布局问题。ExtJS是一款强大的JavaScript库,用于构建富客户端应用程序,其表格组件是功能丰富的数据展示工具...

    EXTjs4.0以下合并表格

    在合并表格时,可能需要修改模板以实现合并效果。 6. **Ext.util.Renderable**: 如果选择扩展EXTjs的基本组件,可能需要深入理解`Ext.util.Renderable`类,它是EXTjs中所有可视组件的基类,提供了渲染和布局的基础...

    Extjs 轻松实现下拉框联动

    最近小弟做了Extjs实现实现下拉框联动的效果,参考了好久才学会,闲下来发一个简单的例子。。呵呵

    Extjs 合并单元格

    总的来说,实现“Extjs 合并单元格”需要理解Ext JS的Grid Panel、Columns、渲染器工作原理,以及如何通过CSS和JavaScript操作DOM来达到合并效果。同时,还需要考虑用户体验和性能优化,确保合并功能的稳定性和效率...

    extjs实现的带标签、翻页动画的书

    在ExtJS中实现翻书效果,可能涉及到`Ext.fx.Anim`类,这是ExtJS的动画引擎,用于创建各种过渡和动画效果。开发者可能通过设置动画参数,如持续时间、缓动函数、关键帧等,来实现书页翻转时的平滑动态效果。此外,`...

    ExtjS实现聊天功能

    8. **样式定制**:ExtJS允许通过CSS或SASS进行样式定制,以达到与QQ类似的视觉效果。使用`Ext.util.CSS`和`Ext.dom.Element`可以方便地动态修改样式。 9. **性能优化**:由于聊天应用可能涉及到大量的数据展示和...

    Extjs实现下拉菜单效果

    在本篇文章中,我们将详细了解如何使用ExtJS框架实现具有下拉树功能的下拉菜单效果。ExtJS是一个成熟的JavaScript框架,用于创建交互式的Web应用程序,提供了一整套丰富的用户界面组件,其下拉树组件是其众多组件之...

    extjs合并单元格

    标题中的“extjs合并单元格”指的是在使用Ext JS这个JavaScript框架时,如何实现表格(Grid)中的单元格合并功能。Ext JS是一个用于构建富客户端Web应用的前端框架,提供了丰富的组件库,其中包括数据网格(Data ...

    extjs实现增删查改

    在“extjs实现增删查改”这个主题中,我们将探讨如何使用ExtJS来实现基本的数据操作功能。 首先,增删查改(CRUD,Create, Read, Update, Delete)是任何数据管理应用的核心功能。在ExtJS中,我们可以利用Grid ...

    ExtJs4.0跨行合并(按照指定列合并)(Ext.net 2.0)

    在本文中,我们将深入探讨如何在ExtJS 4.0框架下实现跨行合并功能,特别是在表格组件(GridPanel)中按照指定列进行合并。这个技术对于数据展示和报告生成非常有用,因为它可以帮助用户更清晰地理解数据结构。我们将...

    Extjs 实现增删改查

    Extjs 实现增删改查,可以与后台代码结合起来,利于实现

    基于SpringBoot+FreeMarker+MyBatis+ExtJs实现的一个通用后台管理系统,界面美观,适合快速迭代开发

    基于SpringBoot+FreeMarker+MyBatis+ExtJs实现的一个通用后台管理系统,界面美观,适合快速迭代开发 项目说明 技术栈: SpringBoot MyBatis Redis MySQL FreeMarker ExtJs 基于SpringBoot+FreeMarker+MyBatis+...

    Extjs实现的聊天室

    在本项目中,“Extjs实现的聊天室”利用了ExtJS的组件化特性和WebSocket技术,构建了一个实时的在线聊天平台。 WebSocket是一种在客户端和服务器之间建立长连接的协议,允许双方进行全双工通信,即数据可以在任意...

    Ext grid合并单元格

    根据提供的文件信息,我们可以深入探讨如何在 Ext JS 中实现 Grid 的单元格合并功能。此案例主要涉及到了自定义 GridView 的 `renderHeaders` 方法来达到单元格合并的目的,并且还涉及了模板(Template)的使用、...

    extjs实现报表

    在"extjs实现报表"这个主题中,我们将深入探讨如何利用ExtJS来设计和实现各种类型的报表。 1. **ExtJS报表基础** - **数据绑定**:ExtJS支持双向数据绑定,可以轻松地将数据显示在UI上,并实时更新数据变化。 - *...

    extjs 实现动态表头

    标题“extjs 实现动态表头”表明我们要讨论的是如何在ExtJS环境中构建一个能够动态改变列头的表格。动态表头的核心在于理解ExtJS的GridPanel组件和ColumnModel类。GridPanel用于显示数据,而ColumnModel则定义了...

Global site tag (gtag.js) - Google Analytics