- 浏览: 268037 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
xurun:
点击节点的时候出错,怎么办??1120行,data为空为或不是 ...
TreeGrid -
QQ371496669:
引用load方式检索不到的话会抛出org.hibernate. ...
Hibernate中No row with the given identifier exists -
汽车城路:
我现在正在使用这个Extjs,目前也遇到了这个问题,就是怎么换 ...
ext使用--Panel和iframe联合使用时页面高度的解决方法 -
jsjzhou:
有必要. 在实际项目我们就采用了HttpUrlConnecti ...
HttpURLConnection VS HttpClient性能测试 -
小猪笨笨:
不错,通俗易懂
在oracle中创建unique唯一约束(单列和多列)
TreeGrid.js原路径:http://www.extjs.com/forum/showthread.php?t=37831
效果图(查看附件treegrid.gif)
Ext的treePanel提供了很丰富实用功能,可以现自由拖拽、添加、删除等,但是缺点是只能显示一行信息,无法满足需求;Ext2.0的Demo里有提供一个Cloumn tree的实现,但是无法使用checkbox事件,为了让tree+cloumn+checkbox和平共处,本来打算改一下Cloumn tree的实现的,写之前浏览了一下ext论坛的扩展实现和插件,发现有写好的,就直接奉行拿来主义了。作者有讲说这是一个初期版本,需要改进的地方挺多,不管先拿过来看看再说,demo包在上面的路径可以下载到。
1、jsp页面需要引用的文件:
<script type='text/javascript' src='../../../ExtJS/adapter/ext/ext-base.js'></script> <script type='text/javascript' src='../../../ExtJS/ext-all-debug.js'></script> <script type='text/javascript' src='../../../ExtJS/examples/grid/RowExpander.js'></script> <script type='text/javascript' src='../../TreeGrid.js'></script> <link rel="stylesheet" type="text/css" href="../../../ExtJS/resources/css/ext-all.css" /> <link rel="stylesheet" type="text/css" href="../../css/TreeGrid.css" /> <link rel="stylesheet" type="text/css" href="../../css/TreeGridLevels.css" />
以上文件ExtJS目录下都是ext2.0包里自带,TreeGrid.js可以在附件里下载到;样式文件TreeGrid.clss必须要,TreeGridLevels.css可以不须要引用,如果你认为这个样式好看的话也可以引入。
2、来看一下demo里的实现代码:
Controller = function() { function createGrid() { var data = [ {"company":"0. Johnson & Johnson","price":64.72,"change":0.06,"pct_change":0.09,"last_change":"9\/1 12:00am","_id":1,"_parent":null,"_level":1,"_lft":1,"_rgt":98,"_is_leaf":false}, {"company":"1. American International Group, Inc.","price":64.13,"change":0.31,"pct_change":0.49,"last_change":"9\/1 12:00am","_id":2,"_parent":1,"_level":2,"_lft":2,"_rgt":17,"_is_leaf":false}, {"company":"2. Alcoa Inc","price":29.01,"change":0.42,"pct_change":1.47,"last_change":"9\/1 12:00am","_id":3,"_parent":1,"_level":2,"_lft":18,"_rgt":65,"_is_leaf":false}, {"company":"3. The Coca-Cola Company","price":45.07,"change":0.26,"pct_change":0.58,"last_change":"9\/1 12:00am","_id":4,"_parent":1,"_level":2,"_lft":66,"_rgt":79,"_is_leaf":false}, {"company":"4. Citigroup, Inc.","price":49.37,"change":0.02,"pct_change":0.04,"last_change":"9\/1 12:00am","_id":5,"_parent":null,"_level":1,"_lft":99,"_rgt":100,"_is_leaf":true}, {"company":"5. Hewlett-Packard Co.","price":36.53,"change":-0.03,"pct_change":-0.08,"last_change":"9\/1 12:00am","_id":6,"_parent":null,"_level":1,"_lft":101,"_rgt":118,"_is_leaf":false}, {"company":"6. McDonald's Corporation","price":36.76,"change":0.86,"pct_change":2.4,"last_change":"9\/1 12:00am","_id":7,"_parent":1,"_level":2,"_lft":80,"_rgt":85,"_is_leaf":false}, {"company":"7. The Procter & Gamble Company","price":61.91,"change":0.01,"pct_change":0.02,"last_change":"9\/1 12:00am","_id":8,"_parent":4,"_level":3,"_lft":67,"_rgt":76,"_is_leaf":false}, {"company":"8. Johnson & Johnson","price":64.72,"change":0.06,"pct_change":0.09,"last_change":"9\/1 12:00am","_id":9,"_parent":2,"_level":3,"_lft":3,"_rgt":6,"_is_leaf":false}, {"company":"9. Microsoft Corporation","price":25.84,"change":0.14,"pct_change":0.54,"last_change":"9\/1 12:00am","_id":10,"_parent":7,"_level":3,"_lft":81,"_rgt":82,"_is_leaf":true}, {"company":"10. E.I. du Pont de Nemours and Company","price":40.48,"change":0.51,"pct_change":1.28,"last_change":"9\/1 12:00am","_id":11,"_parent":3,"_level":3,"_lft":19,"_rgt":36,"_is_leaf":false}, {"company":"11. Honeywell Intl Inc","price":38.77,"change":0.05,"pct_change":0.13,"last_change":"9\/1 12:00am","_id":12,"_parent":11,"_level":4,"_lft":20,"_rgt":29,"_is_leaf":false}, {"company":"12. Microsoft Corporation","price":25.84,"change":0.14,"pct_change":0.54,"last_change":"9\/1 12:00am","_id":13,"_parent":4,"_level":3,"_lft":77,"_rgt":78,"_is_leaf":true}, {"company":"13. American International Group, Inc.","price":64.13,"change":0.31,"pct_change":0.49,"last_change":"9\/1 12:00am","_id":14,"_parent":null,"_level":1,"_lft":119,"_rgt":122,"_is_leaf":false}, {"company":"14. Hewlett-Packard Co.","price":36.53,"change":-0.03,"pct_change":-0.08,"last_change":"9\/1 12:00am","_id":15,"_parent":null,"_level":1,"_lft":123,"_rgt":136,"_is_leaf":false} ]; // add in some dummy descriptions and loaded flag for (var i = 0; i < data.length; i++) { data[i].desc = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed metus nibh, sodales a, porta at, vulputate eget, dui. Pellentesque ut nisl. Maecenas tortor turpis, interdum non, sodales non, iaculis ac, lacus. Vestibulum auctor, tortor quis iaculis malesuada, libero lectus bibendum purus, sit amet tincidunt quam turpis vel lacus. In pellentesque nisl non sem. Suspendisse nunc sem, pretium eget, cursus a, fringilla vel, urna.<br/><br/>Aliquam commodo ullamcorper erat. Nullam vel justo in neque porttitor laoreet. Aenean lacus dui, consequat eu, adipiscing eget, nonummy non, nisi. Morbi nunc est, dignissim non, ornare sed, luctus eu, massa. Vivamus eget quam. Vivamus tincidunt diam nec urna. Curabitur velit.'; data[i]._is_loaded = true; } var expander = new Ext.grid.RowExpander({ tpl : new Ext.Template( '<p><b>Company:</b> {company}</p><br>', '<p><b>Summary:</b> {desc}</p>' ) }); // create the data store var record = Ext.data.Record.create([ {name: 'company'}, {name: 'price', type: 'float'}, {name: 'change', type: 'float'}, {name: 'pct_change', type: 'float'}, {name: 'last_change', type: 'date', dateFormat: 'n/j h:ia'}, {name: 'desc'}, {name: '_id', type: 'int'}, {name: '_level', type: 'int'}, {name: '_lft', type: 'int'}, {name: '_rgt', type: 'int'}, {name: '_is_leaf', type: 'bool'} ]); var store = new Ext.ux.maximgb.treegrid.NestedSetStore({ autoLoad : true, reader: new Ext.data.JsonReader({id: '_id'}, record), proxy: new Ext.data.MemoryProxy(data) }); // create the Grid var grid = new Ext.ux.maximgb.treegrid.GridPanel({ store: store, master_column_id : 'company', columns: [ expander, {id:'company',header: "Company", width: 160, sortable: true, dataIndex: 'company'}, {header: "Price", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price'}, {header: "test", width: 75, sortable: true, renderer: 'usMoney', dataIndex: 'price',renderer:showbox,align:'center'}, {header: "Change", width: 75, sortable: true, renderer: change, dataIndex: 'change'}, {header: "% Change", width: 75, sortable: true, renderer: pctChange, dataIndex: 'pct_change'}, {header: "Last Updated", width: 85, sortable: true, renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'last_change'} ], stripeRows: true, autoExpandColumn: 'company', title: 'Array Grid', root_title: 'Companies', plugins: expander, viewConfig : { enableRowBody : true } }); var vp = new Ext.Viewport({ layout : 'fit', items : grid }); grid.getSelectionModel().selectFirstRow(); } function showbox(value){ return "<input type=checkbox name='item' value='"+value+"'>"; } // example of custom renderer function function change(val) { if (val > 0) { val = '<span style="color:green;">' + val + '</span>'; } else if(val < 0) { val = '<span style="color:red;">' + val + '</span>'; } return val; } // example of custom renderer function function pctChange(val) { if (val > 0) { val = '<span style="color:green;">' + val + '%</span>'; } else if(val < 0) { val = '<span style="color:red;">' + val + '%</span>'; } return val; } return { init : function() { createGrid(); } } }(); Ext.onReady(Controller.init);
3、数据分析
{"company":"0. Johnson & Johnson","price":64.72,"change":0.06,"pct_change":0.09,"last_change":"9\/1 12:00am","_id":1,"_parent":null,"_level":1,"_lft":1,"_rgt":98,"_is_leaf":false},
这是数组data的其中一行数据,我们可以看到除了业务数据以外,还有几个比较特殊的数据:_id,_parent,_level,_lft,_rgt,_is_leaf。这几个值必须要有的,下面我们来看看这几个属性的作用。
_id:这个不用讲了吧。
_parent:值必须为父级菜单的id值。
_level:菜单级别。
_lft & _rgt:这两个值我看了半天才明白,按照二叉树的索引位置来计算的,具体的请参考http://dev.mysql.com/tech-resources/articles/hierarchical-data.html
_is_leaf: 是不是最终节目节。
注:如果要跑通例子的话,把上面的这几个属性名称前面的'_'下划线都去了吧,不太习惯这样写,所以下面附件里的代码稍微做了一下改动;还有就是如果讨厌计算_lft和_rht的值,可以在数据库里或者在生json的时候就自定义排下序,如果你是按照二叉树的索引位置来排序的话,可以不用设置_lft和_rgt的值,否则会造成子菜单的位置与父菜单不对应的情况。上面是请求的本地的一个数组,下面我把远程请求json的加载方法发一下:
var store = new Ext.ux.maximgb.treegrid.AdjacencyListStore({ autoLoad : true, url: '../tree!list.action?id='+id+'&format=json', reader: new Ext.data.JsonReader( { id: 'id', root: 'menu', totalProperty: 'total', successProperty: 'success' }, record ) });
4、创建Ext.ux.maximgb.treegrid.GridPanel参数说明
master_column_id:值为ColumnModel中设置的需要作为tree显示的一列的id,如上例中的cloumns的第一列"id:'company'",注意要将dataIndex这一列的数据放在第一列显示;
autoExpandColumn: 同上;
root_title:显示的tree的根,值是一个字符串,如果为空会自动获取title的值,都为空里显示root。
其它属性与普通grid用法一样。
之所以选择使用这个而不是cloumn tree是因为在renderer checkbox并触发checkbox事件的时候不会发生错误。如果你想调试运行可以直接去下demo域者跑通这个都可以。不使用远程数据就直接可以在apache环境运行。这里获取远程数据是结合java使用的,也可以改成php的。
下次再发一下TreeGrid源码解读。以上实现方式如果有不正确的地方多指证!
评论
help:keyrunly@163.com
http://www.extjs.com/forum/showthread.php?t=37831&page=3
看第26楼
(抛弃ext,选择jquery)呵呵
这是我生成treegrid数据集的代码,大家看看有什么帮助吗:
DataSet ds = 你自己的数据集; ds.Tables[0].Columns.Add("_id"); ds.Tables[0].Columns.Add("_parent"); ds.Tables[0].Columns.Add("_level"); ds.Tables[0].Columns.Add("_lft"); ds.Tables[0].Columns.Add("_rgt"); ds.Tables[0].Columns.Add("_is_leaf"); int k = 1; int[] iList = new int[ds.Tables[0].Rows.Count]; for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { for (int j = 0; j < iList.Length; j++) { if (k == iList[j])//如果值已经用过 { k++; } } ds.Tables[0].Rows[i]["_id"] = Convert.ToString(ds.Tables[0].Rows[i]["FunWBS"]); ds.Tables[0].Rows[i]["_parent"] = Convert.ToString(ds.Tables[0].Rows[i]["FunPWBS"]); if (Convert.ToString(ds.Tables[0].Rows[i]["_parent"]) == "") ds.Tables[0].Rows[i]["_parent"] = "null"; ds.Tables[0].Rows[i]["_lft"] = k; string funWBS = Convert.ToString(ds.Tables[0].Rows[i]["FunWBS"]); DataRow[] dr = ds.Tables[0].Select(" FunPWBS LIKE '" + funWBS + "%' "); if (dr.Length == 0) { ds.Tables[0].Rows[i]["_rgt"] = k + 1; ds.Tables[0].Rows[i]["_is_leaf"] = "true"; k++; } else { ds.Tables[0].Rows[i]["_rgt"] = k + 1 + dr.Length * 2; iList[i] = k + 1 + dr.Length * 2; ds.Tables[0].Rows[i]["_is_leaf"] = "false"; } ds.Tables[0].Rows[i]["_level"] = Convert.ToString((funWBS.Length / 3)); k++; string funName = Convert.ToString(ds.Tables[0].Rows[i]["FunName"]); string funID = Convert.ToString(ds.Tables[0].Rows[i]["FunID"]); string _id = Convert.ToString(ds.Tables[0].Rows[i]["_id"]); string _parent = Convert.ToString(ds.Tables[0].Rows[i]["_parent"]); string _level = Convert.ToString(ds.Tables[0].Rows[i]["_level"]); string _lft = Convert.ToString(ds.Tables[0].Rows[i]["_lft"]); string _rgt = Convert.ToString(ds.Tables[0].Rows[i]["_rgt"]); string _is_leaf = Convert.ToString(ds.Tables[0].Rows[i]["_is_leaf"]); string limit = "0"; for (int m = 0; m < dsLimit.Tables[0].Rows.Count;m++ ) { if (Convert.ToString(dsLimit.Tables[0].Rows[m]["FunID"]) == funID) { limit = Convert.ToString(dsLimit.Tables[0].Rows[m]["Limit"]); break; } } sb.Append("{\"FunID\":\"" + funID + "\",\"FunName\":\"" + funName + "\",\"FunWBS\":\"" + _id + "\",\"FunPWBS\":\"" + _parent + "\",\"_id\":" + _id + ",\"_parent\":" + _parent + ",\"_level\":" + _level + ",\"_lft\":" + _lft + ",\"_rgt\":" + _rgt + ",\"_is_leaf\":" + _is_leaf + ",\"Limit\":\"" + limit + "\"},"); } if (sb.ToString() != "") return "[" + sb.ToString().Substring(0, sb.ToString().Length - 1) + "]"; else return "";
里的id是怎么取的呀
id由页面取出传入,后台返回json数据格式的字符串,可使用Ext.decode()方法转换成对象。
里的id是怎么取的呀
没试过
大哥,怎么联系你啊,我现在在用这个TreeGrid呢,那个lft和rgh太恶心了,能去掉么 我的msn:lone1984@hotmail.com,希望能联系你啊
请参考2楼和3楼......
兄弟,比如我数据里已经存在WBS这样的字段,已经排序,你说的不需要设置_lft和_rft这2个字段是什么意思?能举个例子吗?我的QQ:776422467,谢谢
这时不需要设置是因为读出来的数据已经按照treegrid的要求排好序了,所以不需要再设置_lft和_rft的值,排序的规则如(http://dev.mysql.com/tech-resources/articles/hierarchical-data.html文档里的The Nested Set Model部分。
兄弟,比如我数据里已经存在WBS这样的字段,已经排序,你说的不需要设置_lft和_rft这2个字段是什么意思?能举个例子吗?我的QQ:776422467,谢谢
说不用设置_lft和_rft的前提是你读出来的数据是已按照treegrid的要求排好序的,上面有给出链接(http://dev.mysql.com/tech-resources/articles/hierarchical-data.html)文档的The Nested Set Model部分,上面有说明你的数据的排序方法,仔细阅读一下就能理解了。
我的msn:lone1984@hotmail.com,希望能联系你啊
发表评论
-
ext使用--Panel和iframe联合使用时页面高度的解决方法
2009-10-13 17:24 7112在项目使用borderLayout Panel时 ... -
ExtJS的form和grid结合示例
2009-10-13 09:43 8053<script type="text/java ... -
实现Ext表单对checkBoxGroup的统一管理
2009-09-10 11:48 23901 对于类型是checkboxgroup的数据,数据库中保存数 ... -
CheckboxSelectionModel全选后,点击下一页时还原到未选中状态
2009-05-18 16:30 3565在Grid的中使用了CheckboxSelectionMode ... -
Ext2.2 iframe的刷新问题
2009-04-22 10:37 2299在 EXT2.0运行正常的程序,调换 EXT2.2 的脚本之后 ... -
左侧菜单
2009-03-20 18:33 2950自己写了一个菜单,不是很灵活,只支持到三层的树,使用了一点ex ... -
Ext2-资料篇
2009-03-11 14:00 1389EXT GWT 官方网站: http://extjs.co ...
相关推荐
在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中实现树形表格,即TreeGrid。TreeGrid是WPF中的一个高级控件,它结合了树视图(TreeView)和数据网格(DataGrid)的功能,使得我们可以展示...
layui提供了一系列丰富的组件,其中“树表格”(TreeGrid)是结合了表格和树形结构的一种特殊展示形式,常用于数据层级关系的展示。本篇文章将深入探讨基于layui的树表格-treeGrid的实现原理、使用方法以及相关的...
TreeGrid.js是一款强大的基于jQuery的表格树插件,它为数据展示提供了一种灵活且具有层次结构的方式。这款插件允许用户将数据以表格的形式展现,并且每行数据可以展开成一个子节点,形成树状结构,使得复杂的数据...
**jQuery TreeGrid 知识点详解** jQuery TreeGrid 是一个基于 jQuery 的插件,用于将普通的HTML表格转换成可折叠的树形结构,提供了一种高效且用户友好的方式来组织和展示层次化数据。这个组件在网页开发中非常实用...
在本文中,我们将深入探讨BootstrapTable Treegrid的使用、功能特性以及如何在实际项目中应用。 BootstrapTable本身是一个轻量级的前端组件,它提供了一种灵活的方式来展示数据,并支持排序、搜索、分页等功能。而...
"easyui-treegrid冻结右侧列插件.zip" 是一个专门针对 EasyUI TreeGrid 设计的插件,它的目标是实现 TreeGrid 中右侧列的冻结效果。这个插件的名称表明它能够帮助用户在 TreeGrid 中固定右侧的部分列,即使滚动表格...
当TreeGrid数据量过大的时候 使用 $('#tg').treegrid('collapseAll'); 和 $('#tg').treegrid('expandAll');会造成严重卡顿, 解决方案: 数据增加属性 state:closed, 即可默认收起,反之展开,需再展开时,将加载...
TreeGrid是一种将表格数据以树形结构展示的前端组件,常用于管理层次关系的数据,如组织结构、文件系统等。在本案例中,“treegrid_barku4k_treegrid_jqueryajax_”是一个基于jQuery的TreeGrid实现,主要用于个人...
**WPF TreeGrid树形表格详解** 在Windows Presentation Foundation (WPF)中,TreeGrid是一种特殊的数据控件,它结合了树形结构和表格的功能,允许用户以分层的方式显示数据,同时每层数据还可以像普通的GridView...
### Ext.ux.tree.TreeGrid 异步加载知识点详解 #### 一、Ext.ux.tree.TreeGrid简介 在ExtJS框架中,`Ext.ux.tree.TreeGrid`组件是一种结合了树形结构与表格显示特性的控件,适用于展示具有层级关系的数据。通过...
实现treegrid组件的(CRUD)读取、新增、修改、删除 //设置grid单元格处于编辑状态 selcell:function(arow,acol){ this.editingPlugin.startEditByPosition({row:arow,column:acol}); }, selcell2:function(node,...
TreeGrid 是 EasyUI 中的一个重要组件,它结合了表格和树形结构的特点,适用于展示层次化数据。在本教程中,我们将深入探讨 jQuery EasyUI TreeGrid 的使用,包括增、删、改、查的基本操作。 首先,我们需要引入 ...
TreeGrid是一种将表格数据以树形结构展示的插件,常用于jQuery库中,它可以将复杂的数据层次结构清晰地呈现出来。本篇文章将深入探讨TreeGrid的使用,包括其基本概念、JSON数据格式、实现方法以及相关的配置选项。 ...
Bootstrap Treegrid是一款基于Bootstrap框架和JavaScript的插件,用于在网页上展示数据为树形结构的表格。这个插件能够将传统的二维表格扩展为可折叠的树状结构,非常适合处理层次化数据,如组织结构、目录层级或者...
EasyUI的Treegrid扩展是一种对原生EasyUI TreeGrid组件的功能增强,主要目的是提供更加灵活的数据展示和操作方式。在传统的TreeGrid中,数据通常是以树状结构展示,每一行都可以展开或折叠,显示或隐藏子节点。然而...
dhtmlxTreeGrid1.2_Pro是一款基于JavaScript的富客户端数据网格组件,它结合了树形结构和表格的功能,提供了一种高效的方式来展示和操作层次化的数据。在这款早期的1.2专业版中,虽然功能可能相对现代版本有所限制,...
**JeasyUI TreeGrid 前后台交互实例详解** 在Web开发中,用户界面的美观性和易用性是至关重要的。JeasyUI是一款基于jQuery的轻量级UI库,提供了丰富的组件,如TreeGrid,用于展示层次结构的数据,同时具备表格的...
在"GridView+Jquery实现的TreeGrid"这个项目中,我们看到的是一个利用这两种技术实现的无刷新TreeGrid。无刷新意味着用户在操作TreeGrid(如展开、折叠节点)时,页面无需重新加载,提高了用户体验。这种实现方式...
这个控件主要类与MS TreeView相似,包括TreeGrid、TreeGridNode、TreeGridRow三个核心类。TreeGridNode表示一个节点,可以有DataItem属性,TreeGridRow表示节点所在的行。TreeGrid当然就是包括Nodes的那个树。另外,...
**基于jQuery的TreeGrid组件详解** 在Web开发中,数据展示是不可或缺的一部分,尤其是在处理层级结构数据时。jQuery TreeGrid组件就是为此而设计的,它将表格与树形结构结合,提供了一种直观且交互性强的数据展示...