`
daoger
  • 浏览: 529727 次
  • 性别: Icon_minigender_1
  • 来自: 山东济南
社区版块
存档分类
最新评论

dhtmlxgrid 1.4功能自助增补(二)--键盘事件和文本类型单元格

阅读更多
3. 在表格中添加需要的键盘事件;目前版本的dhtmlxgrid只支持部分键盘事件,所以你可以根据自己的需要添加。
键盘事件大多是在dhtmlXGrid.js文件this.doKey方法中定义的,当然你也可以在页面中通过setOnKeyPressed()方法自己添加;
以下是我自己修改后的源码,注释掉的部分是自带源码:
	this.doKey = function (ev) {
		if (!ev) {
			return true;
		}
		if ((ev.target || ev.srcElement).value !== window.undefined) {
			var zx = (ev.target || ev.srcElement);
			if ((!zx.parentNode) || (zx.parentNode.className.indexOf("editable") == -1)) {
				return true;
			}
		}
		if ((globalActiveDHTMLGridObject) && (this != globalActiveDHTMLGridObject)) {
			return globalActiveDHTMLGridObject.doKey(ev);
		}
		if (this.isActive == false) {
			return true;
		}
		if (this._htkebl) {
			return true;
		}
		if (!this.callEvent("onKeyPress", [ev.keyCode, ev.ctrlKey, ev.shiftKey])) {
			return false;
		}
	try {
			//daoger_start
			//define flag for judgment the editing state of selected cell 
			var editeabled = null;
			if (this.editor) {
				editeabled = true;
			}
			//var type = this.cellType[this.cell._cellIndex];
			//daoger_end
			//if (ev.keyCode == 13 && (ev.ctrlKey || ev.shiftKey)) {
			//	var rowInd = this.rowsCol._dhx_find(this.row);
			//	if (window.event.ctrlKey && rowInd != this.rowsCol.length - 1) {
			//		if (this.row.rowIndex == this.obj._rowslength() - 1 && this.dynScroll && this.dynScroll != "false") {
			//			this.doDynScroll("dn");
			//		}
			//		this.selectCell(this.rowsCol[rowInd + 1], this.cell._cellIndex, true);
			//	} else {
			//		if (ev.shiftKey && rowInd != 0) {
			//			if (this.row.rowIndex == 0 && this.dynScroll && this.dynScroll != "false") {
			//				this.doDynScroll("up");
			//			}
			//			this.selectCell(this.rowsCol[rowInd - 1], this.cell._cellIndex, true);
			//		}
			//	}
			//	_isIE ? ev.returnValue = false : ev.preventDefault();
			//}
			if (ev.keyCode == 13 && !ev.ctrlKey && !ev.shiftKey) {
				this.editStop();
				//daoger_start
				//modify action of enter key
				//修改回车键事件,使得敲回车后选择状态或焦点下移
				var rowInd = this.row.rowIndex;
				if (rowInd != this.rowsCol.length && rowInd != this.obj.rows.length - 1) {
					var nrow = this.obj._rows(rowInd);
					if (nrow._sRow || nrow._rLoad) {
						return false;
					}
					this.selectCell(nrow, this.cell._cellIndex, true);
					if (editeabled) {
						this.editCell();
					}
				} else {
					if (this.pagingOn && (this.row != this.rowsCol[this.rowsCol.length - 1] || this.rowsBuffer[0].length > 0 || !this.recordsNoMore)) {
						this.changePage(this.currentPage + 1);
						this.selectCell(this.obj._rows(0), this.cell._cellIndex, true);
						if (editeabled) {
							this.editCell();
						}
					}
				}
				//this.callEvent("onEnter", [this.row.idd, this.cell._cellIndex]);
				//daoger_end
				_isIE ? ev.returnValue = false : ev.preventDefault();
			}
			if (ev.keyCode == 9) {
				this.editStop();
				if (ev.shiftKey) {
					var z = this._getPrevCell();
				} else {
					var z = this._getNextCell();
				}
				if (!z) {
					return true;
				}
				this.selectCell(z.parentNode, z._cellIndex, (this.row != z.parentNode));
				this.editCell();
				_isIE ? ev.returnValue = false : ev.preventDefault();
			}
			//daoger_start
			//add action of del key
			//选择一个单元格或多个单元格后,用del键清楚单元格内容
			if (ev.keyCode == 46) {
				if (this._selectionArea) {
					this.clearSelection();
					var startRow = this._selectionArea.LeftTopRow;
					var startCol = this._selectionArea.LeftTopCol;
					var endRow = this._selectionArea.RightBottomRow;
					var endCol = this._selectionArea.RightBottomCol;
					for (var i = startRow; i < endRow + 1; i++) {
						for (var j = startCol; j < endCol + 1; j++) {
							if (!(this.cellType[j] == "linenumber")) {
								this.cells(this.getRowId(i), j).setValue();
							}
						}
					}
					startRow = null;
					startCol = null;
					endRow = null;
					endCol = null;
				} else {
					if (!(this.cellType[this.cell._cellIndex] == "linenumber") && !this.editor) {
						this.cells(this.getSelectedId(), this.cell._cellIndex).setValue();
					}
				}
				return true;
			}
			//daoger_end
			//根据上一个单元格的编辑状态判断通过方向键移动后下一个单元格的状态是处于选择还是编辑状态
			if (ev.keyCode == 40 || ev.keyCode == 38) {
				if (this.editor && this.editor.combo) {
					if (ev.keyCode == 40) {
						this.editor.shiftNext();
					}
					if (ev.keyCode == 38) {
						this.editor.shiftPrev();
					}
					return false;
				} else {
					var rowInd = this.row.rowIndex;
					if (ev.keyCode == 38 && rowInd != 1) {
						var nrow = this.obj._rows(rowInd - 2);
						if (nrow._sRow || nrow._rLoad) {
							return false;
						}
						this.selectCell(this.obj._rows(rowInd - 2), this.cell._cellIndex, true);
						//daoger_start
						//set state of this cell according to last 
						if (editeabled) {
							this.editCell();
						}
						//daoger_end
					} else {
						if (this.pagingOn && ev.keyCode == 38 && rowInd == 1 && this.currentPage != 1) {
							this.changePage(this.currentPage - 1);
							this.selectCell(this.obj.rows[this.obj.rows.length - 1], this.cell._cellIndex, true);
							//daoger_start
							//set state of this cell according to last 
							if (editeabled) {
								this.editCell();
							}
							//daoger_end
						} else {
							if (ev.keyCode == 40 && rowInd != this.rowsCol.length && rowInd != this.obj.rows.length - 1) {
								var nrow = this.obj._rows(rowInd);
								if (nrow._sRow || nrow._rLoad) {
									return false;
								}
								this.selectCell(nrow, this.cell._cellIndex, true);
								//daoger_start
								//set state of this cell according to last 
								if (editeabled) {
									this.editCell();
								}
								//daoger_end
							} else {
								if (this.pagingOn && ev.keyCode == 40 && (this.row != this.rowsCol[this.rowsCol.length - 1] || this.rowsBuffer[0].length > 0 || !this.recordsNoMore)) {
									this.changePage(this.currentPage + 1);
									this.selectCell(this.obj._rows(0), this.cell._cellIndex, true);
									//daoger_start
									//set state of this cell according to last 
									if (editeabled) {
										this.editCell();
									}
									//daoger_end
								}
							}
						}
					}
				}
				_isIE ? ev.returnValue = false : ev.preventDefault();
			}
			//daoger_start
			//add action of left and right key
			//添加左右方向键事件
			if (ev.keyCode == 37 || ev.keyCode == 39) {
				this.editStop();
				if (ev.keyCode == 37) {
					var z = this._getPrevCell();
				} else {
					if (ev.keyCode == 39) {
						var z = this._getNextCell();
					}
				}
				if (!z) {
					return true;
				}
				this.selectCell(z.parentNode, z._cellIndex, (this.row != z.parentNode));
				if (editeabled) {
					this.editCell();
				}
				_isIE ? ev.returnValue = false : ev.preventDefault();
			}
			//daoger_end
			if ((ev.keyCode == 113) && (this._f2kE)) {
				this.editCell();
				return false;
			}
			if (ev.keyCode == 32) {
				var c = this.cell;
				var ed = this.cells4(c);
				if (ed.changeState() != false) {
					_isIE ? ev.returnValue = false : ev.preventDefault();
				}
			}
			if (ev.keyCode == 27 && this.oe != false) {
				this.editStop();
				_isIE ? ev.returnValue = false : ev.preventDefault();
			}
			if (ev.keyCode == 33 || ev.keyCode == 34) {
				if (this.pagingOn) {
					if (ev.keyCode == 33) {
						this.changePage(this.currentPage - 1);
					} else {
						this.changePage(this.currentPage + 1);
					}
				}
				var new_ind = Math.floor((this.getRowIndex(this.row.idd) || 0) + (ev.keyCode != 33 ? 1 : -1) * this.objBox.offsetHeight / (this._srdh || 20));
				if (new_ind < 0) {
					new_ind = 0;
				}
				if (this._dload && (!this.rowsCol[new_ind])) {
					this._askRealRows(new_ind, function () {
						try {
							self.selectCell(new_ind, this.cell._cellIndex, true);
						}
						catch (e) {
						}
					});
				} else {
					if (new_ind >= this.rowsCol.length) {
						new_ind = this.rowsCol.length - 1;
					}
					this.selectCell(new_ind, this.cell._cellIndex, true);
				}
				if (_isIE) {
					ev.returnValue = false;
				} else {
					ev.preventDefault();
				}
			}
			if (!this.editor) {
				if (ev.keyCode == 37 && this.cellType._dhx_find("tree") != -1) {
					this.collapseKids(this.row);
					_isIE ? ev.returnValue = false : ev.preventDefault();
				}
				if (ev.keyCode == 39 && this.cellType._dhx_find("tree") != -1) {
					this.expandKids(this.row);
					_isIE ? ev.returnValue = false : ev.preventDefault();
				}
			}
			return true;
		}
		catch (er) {
			return true;
		}
	};
	

4 文本类型单元格
它可以进行大篇幅文档的存储,但是dhtmlxgrid自带的功能和样式不怎么样,我们可以自己修改。

(1)修改单元格编辑状态下的样式,使得单元格在编辑状态下边框突出。
这是我修改dhtmlXGrid.css后的代码:
	 div.gridbox table.obj tr.rowselected td.cellselected,div.gridbox table.obj td.cellselected{
	background-color: #EDF5FE;
	border: 2px solid #009ACD;
}
	 

(2) 修改txt类型的其他属性,这些都是在dhtmlXGrid.js文件中定义的
	function eXcell_txt(cell) {
	if (cell) {
		this.cell = cell;
		this.grid = this.cell.parentNode.grid;
	}
	this.edit = function () {
		this.val = this.getValue();
		this.obj = document.createElement("TEXTAREA");
		this.obj.className = "dhx_textarea";
		this.obj.onclick = function (e) {
			(e || event).cancelBubble = true;
		};
		var arPos = this.grid.getPosition(this.cell);
		if (!this.cell._clearCell) {
			this.obj.value = this.val;
		}
		this.obj.style.display = "";
		//daoger_start
		//modify textarea align
		this.obj.style.textAlign = "left";//文字对齐方式
		//this.obj.style.textAlign = this.cell.align;
		//daoger_end
		if (_isFF) {
			var z_ff = document.createElement("DIV");
			z_ff.appendChild(this.obj);
			z_ff.style.overflow = "auto";
			z_ff.className = "dhx_textarea";
			this.obj.style.margin = "0px 0px 0px 0px";
			this.obj.style.border = "0px";
			this.obj = z_ff;
		}
		document.body.appendChild(this.obj);
		this.obj.onkeydown = function (e) {
			var ev = (e || event);
			if (ev.keyCode == 9) {
				globalActiveDHTMLGridObject.entBox.focus();
				globalActiveDHTMLGridObject.doKey({keyCode:ev.keyCode, shiftKey:ev.shiftKey, srcElement:"0"});
				return false;
			}
		};
		this.obj.style.left = arPos[0] + "px";
		//daoger_start
		//让单元格编辑状态下自适应文本长度
		//this.obj.style.top = arPos[1] + this.cell.offsetHeight + "px";
		this.obj.style.top = (arPos[1] + 1) + "px";
		//adjust width of textarea under text cell
		//if (this.cell.scrollWidth < 200) {
		//	var pw = 200;
		//} else {
		//	var pw = this.cell.scrollWidth;
		//}
		if (this.cell.scrollWidth < 100) {
			var pw = 100;
		} else {
			if (this.cell.scrollWidth > 200) {
				var pw = 200;
			} else {
				var pw = this.cell.scrollWidth;
			}
		}
		this.obj.style.width = (pw + (_isFF ? 6 : 4)) + "px";
		//this.obj.style.width = (pw + (_isFF ? 18 : 16)) + "px";
		//在键盘输入状态下,文本编辑区域随着文本的增加高度也增加
		this.obj.style.height = "0px";
		//this.obj.onPropertyChange = new Function("this.setTxtHeight(this.obj);");
		//daoger_end
		if (_isFF) {
			this.obj.firstChild.style.width = parseInt(this.obj.style.width) + "px";
			this.obj.firstChild.style.height = this.obj.offsetHeight - 3 + "px";
		}
		this.obj.focus();
		if (_isFF) {
			this.obj.firstChild.focus();
		} else {
			this.obj.focus();
		}
	};
	

来看看效果图:


说明:这只是针对1.4专业版的修改,有些功能在普通版中可能没有。
分享到:
评论
11 楼 afcn0 2007-11-28  
使用utf8或者给xml增加gb2312的charset header
10 楼 javaman1982 2007-11-28  
中文显示都是乱码,有什么好的解决方法吗?
我数据都是从数据库里读出来的~
然后封装到xml里面的 可前台显示出来都是乱码~
9 楼 daoger 2007-11-05  
哦!这个没试过!
8 楼 vtsuper 2007-11-05  
我用了"mygrid.enableBuffering();"
可以一邊scroll,一邊下載資料....
但我希望在scroll的同時可以顯示一個"資料下載中"的DIV...
因此我用了mygrid.setOnScrollHandler('showDiv');
但onscroll沒有onscrollstart,onscrollend之分..因此做不了那種效果
7 楼 daoger 2007-11-03  
vtsuper 写道
沒有哦..我只有free version

還有另一個問題setOnScrollHandler
請問有沒有幫法加一個onscrollstart,onscrollend呢??
假如我希望scroll時會有一個div顯示loading字眼..但只有一個setonscrollhandler是不足夠的

说一下具体需求吧!是不是要实现滚动条向下移动时从后台获取新的数据并显示或者从缓存中获取数据并显示?如果是这样的需求的话,在专业版中已经实现了!
6 楼 vtsuper 2007-11-03  
沒有哦..我只有free version

還有另一個問題setOnScrollHandler
請問有沒有幫法加一個onscrollstart,onscrollend呢??
假如我希望scroll時會有一個div顯示loading字眼..但只有一個setonscrollhandler是不足夠的
5 楼 daoger 2007-11-02  
vtsuper 写道
請問可以分享一下代碼???
我正在希望整現merge cell的功能

如果你有专业版的话我可以给你提供一些帮助!
4 楼 vtsuper 2007-11-02  
請問可以分享一下代碼???
我正在希望整現merge cell的功能
3 楼 vtsuper 2007-11-02  
嗚...請問可以分享嗎?
2 楼 daoger 2007-10-30  
fins 写道
专业版的源代码能弄到吗??

给一个项目组帮忙的时候,人家给的!
1 楼 fins 2007-10-30  
专业版的源代码能弄到吗??

相关推荐

    ASME09增补II-B(中文版).pdf

    ASME09增补II-B中文版主要涵盖了ASME锅炉及压力容器规范的非铁基材料部分,这是针对2009年发布的增补内容。这个规范是国际性的,旨在规定动力锅炉和压力容器制造中使用的非铁基材料的标准和要求。ASME锅炉及压力容器...

    group-09-月增补计划-0228-ED.doc

    《神马集团有限责任公司采购管理月增补计划详解》 神马集团有限责任公司在其采购管理章节中,详细阐述了月度采购计划增补的流程与规定,旨在确保公司的生产稳定和采购效率。这一流程涉及多个部门,从需求提出到计划...

    ASME09增补II-D(中文版).pdf

    ASME(美国机械工程师学会)锅炉及压力容器规范是一部国际公认的重要标准,它涉及到工业生产中的安全和质量控制。此规范的II卷D篇主要关注材料的性能,特别是在公制单位系统下的性能指标。2009年的增补版是对2007年...

    visio信息化设计实例传输传送网07.粤西10波分复用系统扩容工程(第二批增补)--全部为光放板调整.zip

    在本压缩包文件中,我们关注的是一个与智慧城市建设和网络通信工程密切相关的项目——"粤西10波分复用系统扩容工程(第二批增补)"。这个项目涉及到使用Visio进行信息化设计,以优化和扩展现有的通信网络,特别是光...

    医药生物行业:医保局发布意见稿限制地方医保增补-0729-国联证券-18页.pdf

    医药生物行业:医保局发布意见稿限制地方医保增补-0729-国联证券-18页.pdf

    易语言程序免安装版下载

    修改扩展界面支持库一,为“树形框”增加多态检查框功能,相应地添加了多个与检查框相关的属性、方法和事件。 17. 修改高级表格支持库,允许“复制选定文本()”“剪切选定文本()”在“允许选择块”属性为假时复制...

    Houdini进阶案例课镜头增补版-课程网盘链接提取码下载 .txt

    Houdini 进阶案例课镜头增补版是一门专注于 Houdini 高级案例制作的课程。本课程深入探讨了 Houdini 在镜头制作方面的应用,通过实际案例和项目实战,帮助学员掌握 Houdini 的高级技巧和工作流程,提升学员的 ...

    Solaris 8 安装增补-12

    《Solaris 8 安装增补-12》是Sun Microsystems公司发布的一款针对Solaris 8操作系统的重要更新。这个增补包旨在提高系统的稳定性和性能,修复已知的漏洞,并引入新的功能。 Solaris 8是Sun Microsystems开发的一个...

    Solaris 8 安装增补-58

    《Solaris 8 安装增补-58》是Sun Microsystems公司发布的一份重要的技术文档,主要针对Solaris 8操作系统的一个特定更新或补丁包。这份文档的发布日期为2001年4月,详细介绍了如何安装和管理这个增补程序,以确保...

    键盘映射工具 V1.7.3 绿色版 --键盘键的重新定义.rar

    功能:通过修改注册表来进行键盘键的重新定义。本键盘映射工具仅修改注册表,不驻留内存。 通过本工具,你可以将键盘上一些不常用的键定义为其它功能或者将其禁用,如将 ScrollLock 定义为静音、Wake Up 定义为减小...

    Solaris 8 安装增补-20

    《Solaris 8 安装增补-20》是Sun Microsystems公司发布的一款针对Solaris 8操作系统的重要更新。这个增补包旨在提高系统的稳定性和兼容性,包含了自Solaris 8原始版本发布以来的多项修复和改进。该文档详细介绍了...

    ROST-CM6反剽窃免费检测软件使用介绍,使用方法.pdf

    ROST-CM6反剽窃免费检测软件是一款功能强大且功能齐全的内容挖掘系统,旨在帮助用户检测和分析文本内容的原始性和真实性。该软件具备多种分析工具和功能,能够满足不同用户的需求。 在功能性分析方面,ROST-CM6能够...

    65.拾遗增补-线程池-代码演示.mp4

    在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。

    Serv-U FTP的建立和维护手册(增补稿) BY Hermit

    《Serv-U FTP的建立和维护手册(增补稿) BY Hermit》是一份详细阐述如何设置和管理Serv-U FTP服务器的指南。这份手册由Hermit编撰,旨在帮助IT管理员和用户更好地理解和操作这一强大的FTP服务软件。以下将对这份...

    基于注意的CNN-LSTM-CRF在中文临床文本中的实体识别

    - 卷积神经网络(CNN):一种深度学习模型,能够高效地处理空间信息,常用于图像和文本的特征提取。 - 长短期记忆网络(LSTM):一种特殊的循环神经网络(RNN),设计用来避免长期依赖问题,适合处理和预测序列...

    Serv-U FTP的建立和维护手册(增补稿)

    《Serv-U FTP的建立和维护手册(增补稿)》是一部详细阐述如何搭建与管理Serv-U FTP服务器的专业指南。这份手册对于那些希望在自己的网络环境中实施安全、高效FTP服务的IT管理员来说,是一份极其宝贵的参考资料。...

Global site tag (gtag.js) - Google Analytics