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

合并BufferView与LockingGridView

    博客分类:
  • EXT
阅读更多
支持3.X
使用方法

var grid = Ext.grid.GridPanel({

			view : new Ext.ux.grid.ColumnLockBufferView({}),
			cm : new Ext.ux.grid.LockingColumnModel({
						columns : [new Ext.grid.RowNumberer(),.....]
					})
			......

		});




Ext.ns('Ext.ux.grid');
/**
 * 合并BufferView与LockingGridView
 * 
 * @class Ext.ux.grid.ColumnLockBufferView
 * @extends Ext.ux.grid.BufferView
 * @author yaoba
 */
Ext.ux.grid.ColumnLockBufferView = Ext.extend(Ext.ux.grid.BufferView, {});
Ext.apply(Ext.ux.grid.BufferView.prototype,
		Ext.ux.grid.LockingGridView.prototype);

Ext.apply(Ext.ux.grid.ColumnLockBufferView.prototype, {

	lockText : "锁列",
	unlockText : "解锁列",
	initTemplates : function() {
		var ts = this.templates || {};
		if (!ts.master) {
			ts.master = new Ext.Template(
					'<div class="x-grid3" hidefocus="true">',
					'<div class="x-grid3-locked">',
					'<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset" style="{lstyle}">{lockedHeader}</div></div><div class="x-clear"></div></div>',
					'<div class="x-grid3-scroller"><div class="x-grid3-body" style="{lstyle}">{lockedBody}</div><div class="x-grid3-scroll-spacer"></div></div>',
					'</div>',
					'<div class="x-grid3-viewport x-grid3-unlocked">',
					'<div class="x-grid3-header"><div class="x-grid3-header-inner"><div class="x-grid3-header-offset" style="{ostyle}">{header}</div></div><div class="x-clear"></div></div>',
					'<div class="x-grid3-scroller"><div class="x-grid3-body" style="{bstyle}">{body}</div><a href="#" class="x-grid3-focus" tabIndex="-1"></a></div>',
					'</div>',
					'<div class="x-grid3-resize-marker">&#160;</div>',
					'<div class="x-grid3-resize-proxy">&#160;</div>', '</div>');
		}
		this.templates = ts;
		Ext.ux.grid.LockingGridView.superclass.initTemplates.call(this);

		// Ext.ux.grid.BufferView.superclass.initTemplates.call(this);
		var ts = this.templates;
		// empty div to act as a place holder for a row
		ts.rowHolder = new Ext.Template('<div class="x-grid3-row {alt}" style="{tstyle}"></div>');
		ts.rowHolder.disableFormats = true;
		ts.rowHolder.compile();

		ts.rowBody = new Ext.Template(
				'<table class="x-grid3-row-table" border="0" cellspacing="0" cellpadding="0" style="{tstyle}">',
				'<tbody><tr>{cells}</tr>',
				(this.enableRowBody
						? '<tr class="x-grid3-row-body-tr" style="{bodyStyle}"><td colspan="{cols}" class="x-grid3-body-cell" tabIndex="0" hidefocus="on"><div class="x-grid3-row-body">{body}</div></td></tr>'
						: ''), '</tbody></table>');
		ts.rowBody.disableFormats = true;
		ts.rowBody.compile();
	},
	doRender : function(cs, rs, ds, startRow, colCount, stripe, onlyBody) {
		var ts = this.templates, ct = ts.cell, rt = ts.row, last = colCount - 1, buf = [], lbuf = [], cb, lcb, c, p = {}, rp = {}, r;

		var rb = ts.rowBody;
		var rh = this.getStyleRowHeight();
		var vr = this.getVisibleRows();
		var tstyle = 'width:' + this.getTotalWidth() + ';height:' + rh + 'px;';
		var lstyle = 'width:' + this.getLockedWidth() + ';height:' + rh + 'px;';
		rp = {
			tstyle : tstyle
		};

		for (var j = 0, len = rs.length; j < len; j++) {
			r = rs[j];
			cb = [];
			lcb = [];
			var rowIndex = (j + startRow);

			var visible = rowIndex >= vr.first && rowIndex <= vr.last;
			if (visible) {
				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 '
							: ''))
							+ (this.cm.config[i].cellCls ? ' '
									+ this.cm.config[i].cellCls : '');
					p.attr = p.cellAttr = '';
					p.value = c.renderer(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
							&& Ext.isDefined(r.modified[c.name])) {
						p.css += ' x-grid3-dirty-cell';
					}
					if (c.locked) {
						lcb[lcb.length] = ct.apply(p);
					} else {
						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('');
			rp.tstyle = tstyle;
			buf[buf.length] = !visible ? ts.rowHolder.apply(rp) : (onlyBody
					? rb.apply(rp)
					: rt.apply(rp));
			// buf[buf.length] = rt.apply(rp);
			rp.cells = lcb.join('');
			rp.tstyle = lstyle;

			lbuf[lbuf.length] = !visible ? ts.rowHolder.apply(rp) : (onlyBody
					? rb.apply(rp)
					: rt.apply(rp));
			// lbuf[lbuf.length] = rt.apply(rp);
		}
		return [buf.join(''), lbuf.join('')];
	},
	doUpdate : function() {
		if (this.getVisibleRowCount() > 0) {
			var g = this.grid, cm = g.colModel, ds = g.store;
			var cs = this.getColumnData();

			var vr = this.getVisibleRows();
			for (var i = vr.first; i <= vr.last; i++) {
				// if row is NOT rendered and is visible, render it
				if (!this.isRowRendered(i)) {
					var html = this.doRender(cs, [ds.getAt(i)], ds, i, cm
									.getColumnCount(), g.stripeRows, true);
					this.getRow(i).innerHTML = html[0];
					this.getLockedRow(i).innerHTML = html[1];
				}
			}
			this.clean();
		}
	},
	syncScroll : function(e) {
		var mb = this.scroller.dom;
		this.lockedScroller.dom.scrollTop = mb.scrollTop;
		Ext.ux.grid.LockingGridView.superclass.syncScroll.call(this, e);
		this.update();
	},
	layout : function() {
		Ext.ux.grid.BufferView.superclass.layout.call(this);
		this.update();

		if (!this.mainBody) {
			return;
		}
		var g = this.grid;
		var c = g.getGridEl();
		var csize = c.getSize(true);
		var vw = csize.width;
		if (!g.hideHeaders && (vw < 20 || csize.height < 20)) {
			return;
		}
		this.syncHeaderHeight();
		if (g.autoHeight) {
			this.scroller.dom.style.overflow = 'visible';
			this.lockedScroller.dom.style.overflow = 'visible';
			if (Ext.isWebKit) {
				this.scroller.dom.style.position = 'static';
				this.lockedScroller.dom.style.position = 'static';
			}
		} else {
			this.el.setSize(csize.width, csize.height);
			var hdHeight = this.mainHd.getHeight();
			var vh = csize.height - (hdHeight);
		}
		this.updateLockedWidth();
		if (this.forceFit) {
			if (this.lastViewWidth != vw) {
				this.fitColumns(false, false);
				this.lastViewWidth = vw;
			}
		} else {
			this.autoExpand();
			this.syncHeaderScroll();
		}
		this.onLayout(vw, vh);
	}
});

1
1
分享到:
评论
1 楼 465513006 2013-09-12  
楼主,用了你的代码后会报错,报错信息是
TypeError: templates.masterTpl is undefined


return templates.masterTpl.apply({

Lockin...View.js (第 377 行)
不知道什么原因,楼主能不能留个联系方式,要做一个功能需要用到这个,但是网上找的其他代码在火狐和Ie下是有bug的,找了好久都没有解决

相关推荐

    C# 重写datagridview(合并单元格与列头)

    标题“C# 重写datagridview(合并单元格与列头)”正指向了这一需求。 首先,让我们深入理解如何合并相同单元格。在`DataGridView`中,如果同一列中有多个单元格具有相同的值,我们可能希望将它们合并,以便节省空间...

    DataGridView合并单元格(纵向合并及横向合并)

    - 确定要合并的列,方法与纵向合并类似。 - 设置这些列的第一个单元格的AdvancedCellFormatFlags属性为DataGridViewAdvancedCellFormatFlags.Spanned。 - 设置这个单元格的Span属性,指定它应该覆盖的列数。 - ...

    easyui-bufferview.js(修改后)

    bufferview滚动时,滚动前后合并单元格修改, 要在自己的文件中,加入单元格合并方法: function _setDefaultMearge(rows) { var rows = $("#tt").datagrid('getRows'); var len = rows.length; var preIndex = 0...

    xsteel图纸合并_tekla_tekla图纸合并_图纸合并_

    2. 对齐模型:导入模型后,需要进行模型对齐,确保各个部分的位置与实际工况一致。这可能涉及调整坐标系、旋转和缩放模型。 3. 合并视图:接下来,选择需要合并的视图,这些视图可能包括平面图、立面图、剖面图等。...

    QTableWidget-表格的合并与拆分

    本教程将深入探讨如何在`QTableWidget`中实现表格的合并与拆分,以满足用户界面设计的需求。 首先,让我们理解`QTableWidget`的基本结构。它是一个基于网格布局的组件,由行(rows)和列(columns)组成,每个交叉...

    app和bootload自动合并小程序 hex合并工具

    "app和bootload自动合并小程序 hex合并工具"是针对这种技术的一个实用工具,主要用于处理小程序的开发过程中的特定环节。 首先,我们要理解“app”和“bootload”的概念。在一般的软件开发中,"app"通常指的是应用...

    WPF DataGrid合并行

    在处理大量数据时,我们有时需要对行进行合并以提高视觉效果和信息组织,例如,当需要合并具有相同值的列或创建表头时。本篇文章将深入探讨如何在WPF DataGrid中实现行的合并。 首先,理解DataGrid的基本结构至关...

    Gridcontrol合并表头、合并行、冻结列

    本案例主要探讨如何在VS2012中利用DevExpress GridControl实现表头合并、行合并以及冻结列,这些都是在数据展示时提高用户体验的重要技巧。 首先,我们来看表头合并。在GridControl中,如果需要将多个列的表头合并...

    3dmax分离与合并工具.zip

    本文将深入探讨“3ds Max分离与合并工具”,这些工具是3D艺术家进行模型编辑、动画制作过程中的重要环节。 首先,我们来理解一下“分离”和“合并”这两个概念在3ds Max中的具体含义。分离工具(Detach)主要用于将...

    固件合并_升级版.zip_HEX合并_hex_hex合并工具_hex文件合成_previous4pj

    固件合并与升级是嵌入式系统开发中的一个重要环节,特别是在微控制器(MCU)或嵌入式系统中,固件通常由多个部分组成,如应用程序(App)、引导加载器(Bootloader)以及可能的设备驱动或其他功能模块。在开发过程中...

    HEX合并软件+可用于两个HXE文件的合并

    6. **用户界面与交互**:对于用户友好的软件,应提供直观的界面,让用户能轻松选择要合并的文件、指定合并方式以及查看合并结果。 7. **错误处理**:良好的软件会提供错误检测和报告机制,帮助用户识别和解决可能...

    csv合并工具,csv合并器,csv文件合并工具

    CSV文件批量合并工具(批量合并多个CSV文件)是一款简洁好用,绿色小巧的CSV文件合并工具。CSV文件批量合并工具非常的使用,让你能够更轻松快捷的进行CSV文件合并工作,非常方便。可以同时批量合并多个CSV文本文件,...

    C# DataGrid表头合并和单元格内容合并

    C#中,我们可以利用DataGridColumn.Header属性来设置列的标题,并通过设置HeaderStyle中的GridColumnHeaderStyle.HasSharedHeader属性来指定是否与其他列共享表头。此外,我们还需要调整列的DisplayIndex属性,确保...

    jqgrid合并单元格,合并行、合并列

    jqgrid合并行、合并列 先看示例图片最终效果: jqgrid合并单元格 .jqgrid { width: 80%; margin: 0 auto; } /* 这个代码是解决表头有一点点错位的问题 */ .ui-state-default, .ui-widget-content .ui-state...

    PDF合并,多个pdf可以直接合并到同一个文件

    PDF合并是一种常见的文档处理操作,尤其在处理大量分散的PDF文档时显得尤为必要。这个话题主要涉及如何将多个独立的PDF文件整合到一个单一的PDF文档中,以便于管理和阅读。下面将详细介绍这一过程以及相关的工具和...

    DevExpress 编辑GridControl中合并单元格

    在本话题中,我们将深入探讨如何在DevExpress GridControl中实现单元格的合并,特别是在版本15及以上的情况。 在DevExpress GridControl中,单元格合并通常用于创建具有复杂布局的表格,比如合并相同值的行或列,...

    合并table的行

    本文将深入探讨如何实现“合并table的行”这一功能,以及其背后的原理与应用场景。 ### 合并table的行:原理与实现 在Web开发中,`&lt;table&gt;`元素用于显示数据的表格形式,而合并行的功能主要通过`&lt;td&gt;`或`&lt;th&gt;`标签...

    AD域服务器合并与迁移的解决方案

    在当今快速发展的信息技术领域,企业面临着各式各样的挑战,其中域服务器合并与迁移是企业进行业务扩展、整合资源、更新技术时经常会遇到的情况。随着信息技术的不断升级,域服务器从旧版本的Windows NT 4.0迁移到...

    vue-easytable合并单元格

    这种方法的优势在于,合并逻辑与视图层分离,使得数据更易于管理和复用。 为了更好地实现单元格合并,我们需要了解以下关键点: 1. 数据结构设计:确保数据中包含必要的合并信息,如`mergeKey`或自定义属性来标识需...

Global site tag (gtag.js) - Google Analytics