效果图:

是不是非常酷啊!


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 || ' ',
     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]);
 }
});
css 代码:

.x-grid3-header-offset {
 width: auto;
}
.ext-ie .x-grid3 table.ux-grid-group-table, .ext-safari .x-grid3 table.ux-grid-group-table {
 table-layout: auto;
}
.ux-grid-hd-group-cell {
 background: url(../../../client/ext/resources/images/default/grid/grid3-hrow.gif) repeat-x bottom;
}


调用方式:(主要是 ColumnModel 的 rows 属性不同)

var cm = new Ext.grid.ColumnModel({ 
                 columns:[
                  new Ext.grid.CheckboxSelectionModel({handleMouseDown:Ext.emptyFn}),
                 {
                  header:"序号",
                  dataIndex:"ID",
                        sortable:true
                 },{
                  header:"借书单号",
                  dataIndex:"BorrowNo",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},       
                        sortable:true
                 },{
                  header:"借书人",
                  tooltip:"借书人",
                  dataIndex:"LoginName",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"身份证",
                  dataIndex:"IdentityCard",
                     searchable:false,
                     attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"图书代码",
                  dataIndex:"BCode",
                  attribute:{type:"string",dateFormat:""},  
                        sortable:true
                 },{
                  header:"图书名称",
                  tooltip:"图书名称",
                  dataIndex:"BName",
                        sortable:true
                 },{
                  header:"借书时间",
                  dataIndex:"BorrowDate",
                  searchable:true,
                  attribute:{type:"date",dateFormat:'Y-m-d'}, 
                  renderer: Ext.util.Format.dateRenderer('Y-m-d'), 
                        sortable:true
                 },{
                  header:"借书数量",
                  dataIndex:"BookNum",
                  searchable:true,
                  attribute:{type:"int"},   
                        sortable:true
                 },{
                  header:"费用",
                  dataIndex:"Charge",
                  searchable:true,
                  attribute:{type:"float"},   
                        sortable:true
                 }],
                 defaultSortable: true,
        rows: [
             [
              {rowspan: 2},
              {rowspan: 2},
              {header: 'Before', colspan: 3, align: 'center'},
              {header: 'After', colspan: 2, align: 'center'},
              {header: 'Sum', colspan: 3, align: 'center'}
             ],[
                 {},{},{},{},{},{},{},{} /*******后8列**********/
             ]
        ]
});

var cm = new Ext.grid.ColumnModel({ 
                 columns:[
                  new Ext.grid.CheckboxSelectionModel({handleMouseDown:Ext.emptyFn}),
                 {
                  header:"序号",
                  dataIndex:"ID",
                        sortable:true
                 },{
                  header:"借书单号",
                  dataIndex:"BorrowNo",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},       
                        sortable:true
                 },{
                  header:"借书人",
                  tooltip:"借书人",
                  dataIndex:"LoginName",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"身份证",
                  dataIndex:"IdentityCard",
                     searchable:false,
                     attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"图书代码",
                  dataIndex:"BCode",
                  attribute:{type:"string",dateFormat:""},  
                        sortable:true
                 },{
                  header:"图书名称",
                  tooltip:"图书名称",
                  dataIndex:"BName",
                        sortable:true
                 },{
                  header:"借书时间",
                  dataIndex:"BorrowDate",
                  searchable:true,
                  attribute:{type:"date",dateFormat:'Y-m-d'}, 
                  renderer: Ext.util.Format.dateRenderer('Y-m-d'), 
                        sortable:true
                 },{
                  header:"借书数量",
                  dataIndex:"BookNum",
                  searchable:true,
                  attribute:{type:"int"},   
                        sortable:true
                 },{
                  header:"费用",
                  dataIndex:"Charge",
                  searchable:true,
                  attribute:{type:"float"},   
                        sortable:true
                 }],
                 defaultSortable: true,
        rows: [
             [
              {rowspan: 1},
              {rowspan: 1},
              {header: 'Before', colspan: 3, align: 'center',rowspan: 2},
              {header: 'After', colspan: 2, align: 'center',rowspan: 2},
              {header: 'Sum', colspan: 3, align: 'center',rowspan: 2}
             ],[
                 {},{}  /*******前两列********/
             ]                  
             
        ]
});

var cm = new Ext.grid.ColumnModel({ 
                 columns:[
                  new Ext.grid.CheckboxSelectionModel({handleMouseDown:Ext.emptyFn}),
                 {
                  header:"序号",
                  dataIndex:"ID",
                        sortable:true
                 },{
                  header:"借书单号",
                  dataIndex:"BorrowNo",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},       
                        sortable:true
                 },{
                  header:"借书人",
                  tooltip:"借书人",
                  dataIndex:"LoginName",
                        searchable:true,
                        attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"身份证",
                  dataIndex:"IdentityCard",
                     searchable:false,
                     attribute:{type:"string",dateFormat:""},   
                        sortable:true
                 },{
                  header:"图书代码",
                  dataIndex:"BCode",
                  attribute:{type:"string",dateFormat:""},  
                        sortable:true
                 },{
                  header:"图书名称",
                  tooltip:"图书名称",
                  dataIndex:"BName",
                        sortable:true
                 },{
                  header:"借书时间",
                  dataIndex:"BorrowDate",
                  searchable:true,
                  attribute:{type:"date",dateFormat:'Y-m-d'}, 
                  renderer: Ext.util.Format.dateRenderer('Y-m-d'), 
                        sortable:true
                 },{
                  header:"借书数量",
                  dataIndex:"BookNum",
                  searchable:true,
                  attribute:{type:"int"},   
                        sortable:true
                 },{
                  header:"费用",
                  dataIndex:"Charge",
                  searchable:true,
                  attribute:{type:"float"},   
                        sortable:true
                 }],
                 defaultSortable: true,
        rows: [
             [
              {rowspan: 2},
              {rowspan: 2},
              {header: 'Before', colspan: 3, align: 'center'},
              {header: 'After', colspan: 2, align: 'center',rowspan: 2},
              {header: 'Sum', colspan: 3, align: 'center'}
             ],[
                 /********************Before(共3列)********************/
                 {},
                 {header: 'Before', colspan: 2, align: 'center'},               
                 /********************Sum(共3列)********************/
                 {header: 'Sum', colspan: 2, align: 'center'},
                 {}                
             ]                  
             
        ]
});

[转]收藏的Extjs 多表头插件GroupHeaderGrid的更多相关文章

  1. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  2. 开发extjs常用的插件

    Spket是目前支持Ext 2.0最为出色的IDE. 它采用.jsb project file 文件并将继承于基类和所有文档的内容嵌入到生成代码提示的Script doc中.注:不支持配置项的代码提示 ...

  3. JQuery固定表头插件fixedtableheader源码注释

    在开发XX车站信息系统时,需要将大量数据显示在一个巨大的表格内部,由于表格是一个整体,无法分页,加之数据很多,超出一屏,为了方便用户,决定使用固定表头的插件,经过测试,发现JQuery 插件:fixe ...

  4. SenCha Touch 与 EXTJS 安装Myeclipse 插件

    http://www.cnblogs.com/jirimutu01/default.html 关于SenchaEclipsePlugin插件的安装和使用 使用过eclipse开发java程序的人都知道 ...

  5. ExtJs工具篇(1)——在Aptana3中安装ExtJS 代码提示插件

    首先得下载Aptana 这个软件,我下载的是Aptana3这个版本.下载后,在"帮助"菜单中选择"安装新软件",弹出下面的对话框: 我们需要安装一个叫做&quo ...

  6. ExtJs 继承 和 插件 示例

    Ext.ns('Ext.ux'); function btn(){ alert(this.id); }; var panel_plugs = {//定义插件 init : function(panel ...

  7. 【收藏】下载Chrome商店插件的方法,万恶的gwd

    以下是下载离线插件包的方法: 第一步: 每个Google Chrome扩展都有一个固定的ID,例如https://chrome.google.com/webstore/detail/bfbmjmiod ...

  8. ExtJs如何使用自定义插件动态保存表头配置(隐藏或显示)

    关于保存列表表头的配置,一般我们不需要与后台交互,直接保存在 localStorage 中就能满足常规使用需求(需要浏览器支持). 直接上代码,插件: Ext.define('ux.plugin.Co ...

  9. 使用FlexiGrid实现Extjs表格的效果-网络传输小,更方便!

      近一段时间Extjs真的是风光无限好,只要是个做CRM/HRM之类的企业现在都在琢磨怎么在项目中用它,不过兄弟我可是不敢,原因很简单:太大/太笨/源码不好调试.但是对于Extjs漂亮的表格与功能的 ...

随机推荐

  1. CentOS7下解决ifconfig command not found

    原文地址:https://blog.csdn.net/ryu2003/article/details/78492127 注:本办法仅限于可联网的机器,即在安装时设置了IP地址和DNS可正常上网. 解决 ...

  2. OCR OneNote

    文章地址:https://www.cnblogs.com/Charltsing/p/OneNoteOCR.html 前段时间有人问我能不能通过OneNote扫描图片,并返回文本.经过几天的测试,以及对 ...

  3. Postman 网络调试工具

    1.Postman 简介 Postman 是一款功能强大的网页调试与发送网页 HTTP 请求的工具.我们可以用来很方便的模拟 get 或者 post 或者其他方式的请求来调试接口. 官网下载地址 Po ...

  4. mysql慢查询日志相关参数

    -- mysql慢查询日志相关参数 -- 慢查询日志时间 show variables like "long_query_time"; -- 将时间设置为2s ; -- 是否开启慢 ...

  5. 【转】给Java说句公道话

    有些人问我,在现有的语言里面,有什么好的推荐?我说:“Java.” 他们很惊讶:“什么?Java!” 所以我现在来解释一下. Java超越了所有咒骂它的“动态语言” 也许是因为年轻人的逆反心理,人们都 ...

  6. iOS自己主动化測试的那些干货

    前言 假设有測试大佬发现内容不正确.欢迎指正,我会及时改动. 大多数的iOS App(没有持续集成)迭代流程是这种 也就是说.測试是公布之前的最后一道关卡.假设bug不能在測试中发现,那么bug 就会 ...

  7. MFC带标题栏的窗口和不带标题栏的窗口最大化

    原文链接: http://blog.csdn.net/smartgps2008/article/details/7741223 不带标题栏的窗口最大化: 第一种情况:覆盖任务栏 ShowWindow( ...

  8. Linux shell下30个有趣的命令

    Tips 原文作者:Víctor López Ferrando 原文地址:30 interesting commands for the Linux shell 这些是我收集了多年的Linux she ...

  9. mysql获取group by的总记录行数方法

    mysql获取group by内部可以获取到某字段的记录分组统计总数,而无法统计出分组的记录数. mysql的SQL_CALC_FOUND_ROWS 使用 获取查询的行数 在很多分页的程序中都这样写: ...

  10. 手把手教你ranorex_android源码instrument

    话说ranorex能把android程序看的透彻,关键是在潜伏,他使用instrumentation,在每个界面(activity)里面,准确的说是onresume,也就是页面显示的时候,都给安装了个 ...