`

extjs3 GridPanel合并复杂列头(行 ,列)

 
阅读更多

 1.效果图如下

2.表头

var rows=[[   
               {},{},
              {header: "项目情况",align: "center", colspan: 8},
              {header: "涉及人口变化(人次)",align: "center", colspan: 10}
            ],[{},{header:"主要内容",align:"center",rowspan:2},
               {header:"项目名称或情况<br>(全部列出)",align:"center",rowspan:2},
               {header:"具体位置<br>(详细)",align:"center",rowspan:2},
               {header:"项目个数<br>(个)",align:"center",rowspan:2},
               {header:"涉及面积<br>(平方米)",align:"center",rowspan:2},
               {header:"数量<br>(个/套/户)",align:"center",rowspan:2},
               {header: "迁出地",align: "center", colspan: 2 },
               {header:"完成进度或预<br>计完成时间",align:"center",rowspan:2},
               {header:"人口增加",align:"center",rowspan:2,colspan: 1},
               {header:"",align:"center", colspan: 1,rowspan:1},
               {header:"人口减少",align:"center",rowspan:2},
               {header:"",align:"center", colspan:4 ,rowspan:1},
               {header:"居住人口",align:"center",rowspan:2},
               {header:"就业人口",align:"center",rowspan:2},
               {header:"其他",align:"center",rowspan:2}
      ],[{},{header:"京内<br>(具体到区)",align:"center",colspan: 1 ,rowspan:1},
         {header:"京外<br>(具体到地级市)",align:"center",colspan: 1 ,rowspan:1},
         {header:"其中:外来<br>人口增加",align:"center",colspan: 1 ,rowspan:1},
         {header:"其中:外来<br>人口减少",align:"center",colspan: 1 ,rowspan:1},
         {header:"留在本区",align:"center",rowspan:1},
         {header:"流向本市<br>其地区",align:"center",colspan: 1 ,rowspan:1},
         {header:"离开本市",align:"center",colspan: 1 ,rowspan:1}
     ]];
   var cm = new Ext.grid.ColumnModel({
     columns:[
              new Ext.grid.RowNumberer({width:30}),
             {header:"甲",width:210,dataIndex:'itemName',align:"center"},
             {header:"1",width:150,dataIndex:'projecName',align:"center",rowspan : true,xtype: 'gridcolumn'},
             {header:"2",width:150,dataIndex:'address',align:"center",rowspan : true,xtype: 'gridcolumn'},
             {header:"3",width:80,dataIndex:'projectNum',align:"center",renderer:setData},
             {header:"4",width:80,dataIndex:'aboutArea',align:"center",renderer:setData},
             {header:"5",width:80,dataIndex:'amount',align:"center",renderer:setData},
             {header:"6",width:100,dataIndex:'stayBjAddress',align:"center",rowspan : true,xtype: 'gridcolumn'},
             {header:"7",width:100,dataIndex:'outBjAddress',align:"center",rowspan : true,xtype: 'gridcolumn'},
             {header:"8",width:100,dataIndex:'endTime',align:"center",rowspan : true,xtype: 'gridcolumn'},
             {header:"9",width:80,dataIndex:'peopleAddNum',align:"center"},
             {header:"10",width:80,dataIndex:'outPeopleAdd',align:"center"},
             {header:"11",width:80,dataIndex:'peopleMinus',align:"center"},
             {header:"11",width:80,dataIndex:'outPeopleMinus',align:"center"},
             {header:"13",width:80,dataIndex:'stayInArea',align:"center"},
             {header:"14",width:80,dataIndex:'stayOutInbj',align:"center"},
             {header:"15",width:80,dataIndex:'leaveBj',align:"center"},
             {header:"16",width:80,dataIndex:'residentPopulation'},
             {header:"17",width:80,dataIndex:'employmentPopulation',},
             {header:"18",width:80,dataIndex:'other',align:"center"}
      ],
      rows:rows
   });

3.在gridPanel中引入插件

var mainGrid=new Ext.grid.GridPanel({        
     loadMask:'正在加载数据,请稍候...',  
     cm:cm,
     sm:sm,  
     store:store,
     columnLines : true, 
     plugins: new Ext.tet.plugins.GroupHeaderGrid(),//插件
     iconCls:'grid'
 }); 

4.引入GroupHeaderGrid.js

 

Ext.namespace("Ext.tet.plugins");

Ext.tet.plugins.GroupHeaderGrid = function(config) {
 Ext.apply(this, config);
};

Ext.extend(Ext.tet.plugins.GroupHeaderGrid, Ext.util.Observable, {
 init: function(grid) {
  var v = grid.getView();
  v.beforeMethod('initTemplates', this.initTemplates);
  v.renderHeaders = this.renderHeaders.createDelegate(v, [v.renderHeaders]);
  v.afterMethod('onColumnWidthUpdated', this.updateGroupStyles);
  v.afterMethod('onAllColumnWidthsUpdated', this.updateGroupStyles);
  v.afterMethod('onColumnHiddenUpdated', this.updateGroupStyles);
  v.getHeaderCell = this.getHeaderCell;
  v.updateSortIcon = this.updateSortIcon;
  v.getGroupStyle = this.getGroupStyle;
 },

 initTemplates: function() {
  var ts = this.templates || {};
  if (!ts.gheader) {
   ts.gheader = new Ext.Template(
    '<table border="0" cellspacing="0" cellpadding="0" class="ux-grid-group-table" style="{tstyle}">',
    '<thead>{rows}{header}</thead>',
    '</table>'
   );
  }
  if (!ts.header) {
   ts.header = new Ext.Template(
    '<tr class="x-grid3-hd-row">{cells}</tr>'
   );
  }
  if (!ts.gcell) {
   ts.gcell = new Ext.Template(
    '<td class="x-grid3-hd {cls} x-grid3-td-{id}" style="{style}" rowspan="{rowspan}" colspan="{colspan}">',
    '<div {tooltip} class="x-grid3-hd-inner x-grid3-hd-{id}" unselectable="on" style="{istyle}">{value}</div>',
    '</td>'
   );
  }
  this.templates = ts;
 },

 renderHeaders: function(renderHeaders) {
  var ts = this.templates, rows = [], table = [];
  for (var i = 0; i < this.cm.rows.length; i++) {
   var r = this.cm.rows[i], cells = [], col = 0;
   for (var j = 0; j < r.length; j++) {
    var c = r[j];
    c.colspan = c.colspan || 1;
    c.rowspan = c.rowspan || 1;
    while (table[i] && table[i][col]) {
     col++;
    }
    c.col = col;
    for (var rs = i; rs < i + c.rowspan; rs++) {
     if (!table[rs]) {
      table[rs] = [];
     }
     for (var cs = col; cs < col + c.colspan; cs++) {
      table[rs][cs] = true;
     }
    }
    var gs = this.getGroupStyle(c);
    cells[j] = ts.gcell.apply({
     id: c.id || i + '-' + col,
     cls: c.header ? 'ux-grid-hd-group-cell' : 'ux-grid-hd-nogroup-cell',
     style: 'width:' + gs.width + ';' + (gs.hidden ? 'display:none;' : '') + (c.align ? 'text-align:' + c.align + ';' : ''),
     rowspan: c.rowspan,
     colspan: gs.colspan,
     tooltip: c.tooltip ? (Ext.QuickTips.isEnabled() ? 'ext:qtip' : 'title') + '="' + c.tooltip + '"' : '',
     value: c.header || '&#160;',
     istyle: c.align == 'right' ? 'padding-right:16px' : ''
    });
   }
   rows[i] = ts.header.apply({
    cells: cells.join('')
   });
  }
  return ts.gheader.apply({
   tstyle: 'width:' + this.getTotalWidth() + ';',
   rows: rows.join(''),
   header: renderHeaders.call(this)
  });
 },

 getGroupStyle: function(c) {
  var w = 0, h = true, cs = 0;
  for (var i = c.col; i < c.col + c.colspan; i++) {
   if (!this.cm.isHidden(i)) {
    var cw = this.cm.getColumnWidth(i);
    if(typeof cw == 'number'){
     w += cw;
    }
    h = false;
    cs++;
   }
  }
  return {
   width: (Ext.isBorderBox ? w : Math.max(w - this.borderWidth, 0)) + 'px',
   hidden: h,
   colspan: cs || 1
  }
 },

 updateGroupStyles: function(col) {
  var rows = this.mainHd.query('tr.x-grid3-hd-row');
  for (var i = 0; i < rows.length - 1; i++) {
   var cells = rows[i].childNodes;
   for (var j = 0; j < cells.length; j++) {
    var c = this.cm.rows[i][j];
    if ((typeof col != 'number') || (col >= c.col && col < c.col + c.colspan)) {
     var gs = this.getGroupStyle(c);
     cells[j].style.width = gs.width;
     cells[j].style.display = gs.hidden ? 'none' : '';
     cells[j].colSpan = gs.colspan;
    }
   }
  }
 },

 getHeaderCell : function(index){
  return this.mainHd.query('td.x-grid3-cell')[index];
 },

 updateSortIcon : function(col, dir){
  var sc = this.sortClasses;
  var hds = this.mainHd.select('td.x-grid3-cell').removeClass(sc);
  hds.item(col).addClass(sc[dir == "DESC" ? 1 : 0]);
 }
});

 5.css样式

.x-grid3 table {table-layout: auto;}

.x-grid3-cell-inner, .x-grid3-hd-inner{ white-space: normal; }
.x-toolbar td, .x-toolbar span, .x-toolbar input, .x-toolbar div, .x-toolbar select, .x-toolbar label {
        white-space: normal;

}

6.一些特殊样式需要自己修改

  • 大小: 19.7 KB
分享到:
评论

相关推荐

    EXTjs4.0以下合并表格

    在EXTjs 4.0以下的版本中,开发人员可能会遇到合并表格单元格的需求,这在展示复杂数据或者组织信息时非常有用。EXTjs提供了强大的表格网格组件(GridPanel),允许自定义布局和样式,包括单元格的合并。 在EXTjs中...

    Ext grid合并单元格

    如果某列有 `mtext` 属性,则意味着这列需要被合并。这里通过额外的数组 `mcb` 来存储这些需要合并的列的 HTML 代码。 ```javascript for (var i = 0, len = cm.getColumnCount(); i ; i++) { p.id = cm....

    extjs-4.1.1.zip

    ExtJS的GridPanel提供了高度可配置的表格视图,支持行编辑、分页、排序、过滤、拖放等功能。其强大的功能包括但不限于:行级锁定,用于冻结列;行合并,用于显示复杂的数据结构;以及灵活的数据源绑定,可以对接不同...

    extjs 列表基本操作

    本篇文章将深入探讨EXTJS列表的基本操作,包括设置单元格可编辑、根据条件设置列表行颜色、动态获取列以及实现列的动态合并。 一、设置单元格可编辑 EXTJS的列表提供了CellEditing插件,使得用户可以直接在单元格内...

    extjs_ux_GroupHeaderGrid_GroupHeaderPlugin_-1.4

    这个插件主要用于实现ExtJS Grid组件中的多列头和列头合并,以增强数据展示的可读性和结构化。 GridHeader插件是ExtJS中用于扩展Grid面板功能的一个工具,它允许你在表头中创建分组列,即多个列可以组合成一个大的...

    grid动态生成列参考!

    假设我们的应用场景中,需要前3列保持固定不变,而其余列则根据树节点选择情况动态生成。这通常涉及与后端的交互,从前端向服务器发送请求,获取特定于所选节点的列配置。 #### 三、具体实现步骤 1. **监听树节点...

    Ext的gridpanel控件二次加载问题

    4. 对于复杂的配置,可以将它们分离到单独的配置对象,需要时再合并到GridPanel实例。 总之,解决Ext的gridpanel控件二次加载时丢失的问题需要对Ext JS的生命周期管理有深入的理解,并结合实际应用场景选择合适的...

    轻松搞定Extjs

    - **Ext.apply()和Ext.applyIf()**: 这两个方法用于合并对象属性,是Extjs中常用的设计模式之一。 #### 消息框 消息框是与用户交互的重要手段之一。本章详细介绍了Extjs提供的多种消息框类型及其使用方法。 - **...

    EXTJS工程项目

    EXTJS的源码分析可以帮助我们理解如何使用EXTJS构建复杂的用户界面,学习其组件的配置和事件处理。例如,我们可以通过查看`GridPanel`(数据表格)的配置来学习如何展示和操作数据;通过研究`FormPanel`(表单)来...

    Extjs中文文档.pdf

    - **Ext.apply() 和 Ext.applyIf()**:这两个方法用于合并对象,掌握它们的使用方法对于构建复杂的组件非常有用。 #### 三、消息框 - **基本消息框**:包括提示框、输入框和确认框等,这些都是与用户交互的基本方式...

    ExtJs中文教程

    - **ExtJs**是一款基于JavaScript的开源前端框架,用于构建复杂的Web应用程序。 - 它提供了丰富的UI组件库、强大的数据处理能力和灵活的布局管理机制。 #### 二、准备工作与资源 1. **下载ExtJs** - 可以通过官方...

    Extjs学习带注释

    - **复杂性**:认识到 Extjs 组件结构的复杂性和层次性。 - **组件分类**:了解不同类型的组件及其用途。 - **生命周期**:掌握组件从创建到销毁的整个生命周期。 #### 九、按钮与日期选择器 - **按钮组件**:介绍...

    ExtJs 中文文档

    - **ExtJS** 是一种非常流行的富客户端技术,它主要用于构建复杂的桌面式 Web 应用程序。 - **特点**: - 提供了丰富的 UI 组件库。 - 强大的数据处理能力。 - 支持各种浏览器兼容性问题。 - 高度可定制的界面...

    ExtJS 轻松搞定

    介绍了ExtJS提供的两个实用函数,用于合并对象或数组,帮助读者理解如何在不覆盖现有属性的情况下更新对象。 ### 第三部分:消息框 #### 一、话说消息框 讲述了消息框在用户交互中的作用,以及在ExtJS中如何使用...

    轻松搞定ExtJS

    - **列模型与数据**:介绍了如何配置GridPanel的列模型以及如何加载数据。 #### 第二十章:行模型与Grid视图 - **行选择模型**:讲解了如何配置GridPanel的行选择模型。 - **Grid视图**:介绍了Grid视图的概念及其...

    Extjs中文教程(初学者适合)

    - **加强版的列模型**: 支持更复杂的列配置,如自定义渲染器等。 #### 二十、行模型与Grid视图 - **行选择模型**: 控制用户如何选择表格中的行。 - **Grid视图**: 实现了表格的可视化表现,包括滚动、排序等功能。...

    Extjs中文教程

    - **组件结构**:Extjs中的组件结构复杂且层次分明,每个组件都有一系列生命周期方法。 - **组件分类**:根据功能不同,组件被分为不同的类别,如基本组件、容器、工具栏等。 - **生命周期**:了解组件的创建、渲染...

    Extjs中文教程2.x

    - **复杂性**: Extjs 的组件结构较为复杂,包括各种类型的组件及其生命周期。 - **分类**: 包括基本组件、复合组件等。 **7.2 组件生命周期** - **阶段**: 初始化、渲染、显示/隐藏、销毁等。 - **示例**: 使用 `...

Global site tag (gtag.js) - Google Analytics