jqGrid的树形表格:treeGrid

来源:互联网 发布:mac照片图库怎么删除 编辑:程序博客网 时间:2024/05/01 01:54
jqGrid实现树状Grid http://blog.csdn.net/axzywan/article/details/7384036 
JQgrid tree 终于有数据了 http://www.cnblogs.com/Mr-Joe/archive/2012/03/20/2407958.html 
官方文档: http://www.trirand.com/jqgridwiki/doku.php?id=wiki:treegrid 

问题和注意: 
1. 如果grid的参数存在"rownumbers": true, "rownumWidth": 20,那么无法在正确的位置显示ExpandColumn信息,他会显示在ExpandColumn的前一列。所以应该动态计算并放到下一列。可能会引起setTreeRow方法的错误,因为这个方法是使用真实的ExpandColumn。 
2. jsonReader: {  
                    root: "dataRows", //设定这个参数,有时候也无法正常现实 
                    repeatitems : false  //不需要再去后台刷新,否则可能有问题,所以最好第一次就加载所有数据 
                } 
3. gridview, boolean 设置为true将提高5~10倍的显示速度。但不能再使用treeGrid, subGrid, 或afterInsertRow事件 
4. 如果getNodeParent方法无效,可能是因为你给的recorddata.parentId的类型不对,这里需要recorddata.parentId是字符串,才能找到的. 
5. collapseNode和collapseRow,expandNode和expandRow一般是成对调用。 
6. 移动一个节点以及它的子节点。要字节加方法,才能实现,其实它至此的treegrid功能很弱,一些东西要自己实现,后面附加一些自己实现的方法 



第一个列子 
/pages/demo/tree.json 
---------------------------------- 
Js代码  收藏代码
  1. {  
  2.     "total":11,  
  3.     "page":1,  
  4.     "records":11,  
  5.     "rows":[  
  6.         {"id":1, "name":"Pandy1""cell":["第一级1",0,null,false,false]},  
  7.         {"id":3, "name":"Pandy2""cell":["第二级1",1,1,true,false]},  
  8.         {"id":2, "name":"Pandy3""cell":["第一级2",0,null,true,false]}  
  9.     ]  
  10. }  


Html代码  收藏代码
  1. <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>  
  2. <%@ include file="/common/taglibs.jsp" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6.     <title>Insert title here</title>  
  7.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  8.     <script type="text/javascript" src="<c:url value="/pages/org/grid.treegrid.js"/>"></script>  
  9.     <script type="text/javascript">  
  10.         $(document).ready(function () {  
  11.             $("#treegrid").jqGrid({  
  12.                 treeGrid: true,  
  13.                 treeGridModel: 'adjacency',  
  14.                 ExpandColumn: 'name',  
  15.                 ExpandColClick: true,  
  16.                 url: '/pages/demo/tree.json',  
  17.                 datatype: 'json',  
  18.                 colNames: ["管理选项"],  
  19.                 colModel: [  
  20.                     { name: 'name', index: 'name' }  
  21.                 ],  
  22.                 pager: "false",  
  23.                 height: 'auto',  
  24.                 width: '210',  
  25.                 viewrecords: true,  
  26.                 //   caption: 'none',  
  27.                 jsonReader: {  
  28.                     root: "rows",  
  29.                     total: "total",  
  30.                     repeatitems: true  
  31.                 }  
  32.   
  33.             });  
  34.         })  
  35.         ;  
  36.     </script>  
  37.   
  38. </head>  
  39. <body>  
  40. <table id="treegrid"></table>  
  41. <div id="ptreegrid"></div>  
  42. </body>  
  43. </html>  



第二个例子 
Js代码  收藏代码
  1. [  
  2.     {"id":0,"username":"王三1","level":0,"address":"USA","isLeaf":false,"age":20,"expanded":true,"password":"123"},  
  3.     {"id":1,"username":"王三2","level":1,"address":"USA","isLeaf":false,"age":21,"parent":0,"expanded":true,"password":"123"},  
  4.     {"id":2,"username":"王三3","level":2,"address":"USA","isLeaf":true,"age":22,"parent":1,"expanded":true,"password":"123"}  
  5. ]  


Html代码  收藏代码
  1. <%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>  
  2. <%@ include file="/common/taglibs.jsp" %>  
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
  4. <html>  
  5. <head>  
  6.     <title>Insert title here</title>  
  7.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>  
  8.     <script type="text/javascript" src="<c:url value="/pages/org/grid.treegrid.js"/>"></script>  
  9.     <script type="text/javascript">  
  10.         $(document).ready(function(){  
  11.             jQuery("#treegrid").jqGrid({  
  12.                 treeGrid: true,  
  13.                 treeGridModel: 'adjacency', //treeGrid模式,跟json元数据有关 ,adjacency/nested  
  14.                 ExpandColumn : 'username',  
  15.                 scroll: "true",  
  16.                 url: '/pages/demo/tree1.json',  
  17.                 datatype: 'json',  
  18.                 colNames:['编号','姓名','密码','年龄','地址','出生日期'],  
  19.                 colModel:[  
  20.                     {name:'id',index:'id', width:90,sorttype:"int"},  
  21.                     {name:'username',index:'username', width:110,sorttype:"int"},  
  22.                     {name:'password',index:'password', width:80},  
  23.                     {name:'age',index:'age', width:80},  
  24.                     {name:'address',index:'address', width:80},  
  25.                     {name:'time',index:'time', width:80,sorttype:"date"}  
  26.                 ],  
  27.                 pager: "false",  
  28.                 sortname: 'id',  
  29.                 sortorder: "desc",  
  30.   
  31.                 jsonReader: {  
  32.                     root: "dataRows",  
  33.                     repeatitems : false  
  34.                 },  
  35.                 treeReader : {  
  36.                     level_field: "level",  
  37.                     parent_id_field: "parent",  
  38.                     leaf_field: "isLeaf",  
  39.                     expanded_field: "expanded"  
  40.                 },  
  41.                 caption: "jqGrid test",  
  42.                 mtype: "POST",  
  43.                 height: "auto",    // 设为具体数值则会根据实际记录数出现垂直滚动条  
  44.                 rowNum : "-1",     // 显示全部记录  
  45.                 shrinkToFit:false  // 控制水平滚动条  
  46.             });  
  47.         });  
  48.     </script>  
  49.   
  50. </head>  
  51. <body>  
  52. <table id="treegrid"></table>  
  53. </body>  
  54. </html>  





一些自己实现的方法 
Js代码  收藏代码
  1. /* 以下是常用的方法 */  
  2.         /** 
  3.          * 设定默认关闭的等级,同时自动关闭它的下一级 
  4.          * 这里递归,出现错误 
  5.          * @param GridConfig 
  6.          * @param level 
  7.          */  
  8.         /* --------------------------- tree grid for jqGrid ------------------------------- */  
  9.         setDefaultOpenLevel: function (GridConfig, level) {  
  10.             var childRows = $("#" + GridConfig.divId).jqGrid('getRootNodes');  
  11.             for (var i = 0; i < childRows.length; i++) {  
  12.                 var rows = $("#" + GridConfig.divId).jqGrid('getNodeChildren', childRows[0]);  
  13.                 for (var m = 0; m < rows.length; m++) {  
  14.                     if (rows[m].level <= level) {  
  15.                         $("#" + GridConfig.divId).jqGrid('collapseNode', rows[m]);  
  16.                         $("#" + GridConfig.divId).jqGrid('collapseRow', rows[m]);  
  17.                     }  
  18.   
  19.                     //遍历导致浏览器崩溃,所以多做一次循环,进入深一层继续关闭就好.  
  20.                     var trows = $("#" + GridConfig.divId).jqGrid('getNodeChildren', rows[m]);  
  21.                     for (var k = 0; k < trows.length; k++) {  
  22.                         if (trows[k].level <= (level + 1)) {  
  23.                             $("#" + GridConfig.divId).jqGrid('collapseNode', trows[k]);  
  24.                             $("#" + GridConfig.divId).jqGrid('collapseRow', trows[k]);  
  25.                         }  
  26.                     }  
  27.                 }  
  28.             }  
  29.         },  
  30.         /** 
  31.          * 展开某个节点的所有父节点 
  32.          * @param GridConfig 
  33.          * @param id 
  34.          */  
  35.         openParentsNode: function (GridConfig, rowid) {  
  36.             var currNode = $.GridUtils.getCurrentNode(GridConfig, rowid);  
  37.             currNode.parentId=""+currNode.parentId;  
  38.             var parent = $("#" + GridConfig.divId).jqGrid('getNodeParent', currNode);  
  39.             if (parent != null) {  
  40.                 $("#" + GridConfig.divId).jqGrid('expandNode', parent);  
  41.                 $("#" + GridConfig.divId).jqGrid('expandRow', parent);  
  42.                 $.GridUtils.openParentsNode(GridConfig, parent.id);  
  43.             }  
  44.         },  
  45.         getAllChildrenNodes: function (GridConfig, root, level, treeList) {  
  46.             if (typeof treeList == "undefined") {  
  47.                 treeList = [];  
  48.             }  
  49.             var chs = $("#" + GridConfig.divId).jqGrid('getNodeChildren', root);  
  50.             treeList[treeList.length] = root;  
  51.   
  52.             if (chs != null && chs.length > 0) {  
  53.                 for (var i = 0; i < chs.length; i++) {  
  54.                     $.GridUtils.getAllChildrenNodes(GridConfig, chs[i], level + 1, treeList);  
  55.                 }  
  56.             }  
  57.             return treeList;  
  58.         },  
  59.         /** 
  60.          * 自己实现获得父节点方法 
  61.          * @param GridConfig 
  62.          * @param rowid 
  63.          * @returns {*} 
  64.          */  
  65.         getNodeParent: function (GridConfig, rowid) {  
  66.             var roots = $("#" + GridConfig.divId).jqGrid('getRootNodes');  
  67.             var row = $.GridUtils.getRowData(GridConfig, rowid);  
  68.   
  69.             for (var i = 0; i < roots.length; i++) {  
  70.                 var treeList = $.GridUtils.getAllChildrenNodes(GridConfig, roots[i], 0);  
  71.                 for (j = 0; j < treeList.length; j++) {  
  72.                     if (treeList[j].id == row.parentId) {  
  73.                         return  treeList[j]  
  74.                     }  
  75.                 }  
  76.             }  
  77.   
  78.             return null;  
  79.         },  
  80.         /** 
  81.          * 自己实现获得当前节点方法 
  82.          * @param GridConfig 
  83.          * @param rowid 
  84.          * @returns {*} 
  85.          */  
  86.         getCurrentNode: function (GridConfig, rowid) {  
  87.             var roots = $("#" + GridConfig.divId).jqGrid('getRootNodes');  
  88.             var row = $.GridUtils.getRowData(GridConfig, rowid);  
  89.   
  90.             for (var i = 0; i < roots.length; i++) {  
  91.                 var treeList = $.GridUtils.getAllChildrenNodes(GridConfig, roots[i], 0);  
  92.                 for (j = 0; j < treeList.length; j++) {  
  93.                     if (treeList[j].id == row.id) {  
  94.                         return  treeList[j]  
  95.                     }  
  96.                 }  
  97.             }  
  98.   
  99.             return null;  
  100.         },  
  101.         /** 
  102.          * 第一个节点是当前节点,第二个以及后面的,属于它的子节点 
  103.          * @param GridConfig 
  104.          * @param rowid 
  105.          * @returns {*} 
  106.          */  
  107.         getAllChildrenNodesByRowId: function (GridConfig, rowid) {  
  108.             var row = $.GridUtils.getRowData(GridConfig, rowid);  
  109.             row._id_ = row.id;  
  110.             var rowList = $.GridUtils.getAllChildrenNodes(GridConfig, row, row.level);  
  111.             if (rowList == null || rowList.length == 0)  
  112.                 return rowList;  
  113.   
  114.             if (rowList != null && rowList.length > 0) {  
  115.                 //替换当前节点  
  116.                 rowList[0] = $.GridUtils.getCurrentNode(GridConfig, rowid);  
  117.             }  
  118.             return rowList;  
  119.   
  120.         },  
  121.         /** 
  122.          * 自己实现的删除节点以及子节点,注意,先从叶子删除 
  123.          * @param GridConfig 
  124.          * @param rowid 
  125.          */  
  126.         deleteTreeNodeAndChildren: function (GridConfig, rowid) {  
  127.             var treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, rowid);  
  128.             //先删除子节点再删除当前节点  
  129.             for (var i = treeList.length - 1; i >= 0; i--) {  
  130.                 if (treeList[i] != null)  
  131.                     $("#" + GridConfig.divId).jqGrid('delTreeNode', treeList[i].id);  
  132.             }  
  133.         },  
  134.         /** 
  135.          * 移动一个节点到另一个节点 
  136.          * @param GridConfig 
  137.          * @param newNodeData 
  138.          */  
  139.         moveTreeNode: function (GridConfig, newNodeData) {  
  140.             if (typeof(newNodeData.parentId) == "undefined") {  
  141.                 alert("没有设定父节点ID");  
  142.                 return;  
  143.             }  
  144.             var levelPad = 0;  //用于校对心节点的level  
  145.             var rowid = typeof(newNodeData.rowid) == "undefined" ? newNodeData.id : newNodeData.rowid;  
  146.             var newParentId = newNodeData.parentId;  
  147.             var newParent;  
  148.             var oldParent;  
  149.             //获得之前的当前节点以及所有子节点  
  150.             var treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, rowid);  
  151.             //alert("treeList=" + $.toJSON(treeList));  
  152.             if (treeList != null && treeList.length > 0) {  
  153.                 newParent = $.GridUtils.getCurrentNode(GridConfig, newParentId);  
  154.                 oldParent = $.GridUtils.getCurrentNode(GridConfig, treeList[0].parentId);  
  155.                 //新旧的父节点的level差量  
  156.                 if (newParent != null) {  
  157.                     //levelPad = newParent.level - treeList[0].level;  
  158.                     levelPad = newParent.level - oldParent.level;  
  159.                 }  
  160.                 //alert("newParent="+ $.toJSON(newParent));  
  161.                 //alert("oldParent="+ $.toJSON(oldParent));  
  162.                 //alert("levelPad="+ levelPad);  
  163.             }  
  164.   
  165.             //删除当前节点以及所有子节点  
  166.             $.GridUtils.deleteTreeNodeAndChildren(GridConfig, rowid);  
  167.             //alert("deleteTreeNodeAndChildren");  
  168.   
  169.             //更新当前节点的业务信息  
  170.             treeList[0] = $.extend(treeList[0], newNodeData);  
  171.   
  172.             for (var i = 0; i < treeList.length; i++) {  
  173.                 treeList[i]._id_ = treeList[i].id;  
  174.                 treeList[i].loaded = true;  
  175.                 //新旧的父节点的level差量 + 1,就是当前节点应该的level  
  176.                 treeList[i].level = treeList[i].level + levelPad;  
  177.                 //alert("treeList[i]=" + $.toJSON(treeList[i]));  
  178.                 $("#" + GridConfig.divId).jqGrid('addChildNode', treeList[i].id, treeList[i].parentId, treeList[i]);  
  179.             }  
  180.             $.GridUtils.openParentsNode(GridConfig, treeList[0].id);  
  181.   
  182.             //return;  
  183.   
  184.             //旧的父节点不存在子节点的时候,无法隐藏图标,另求其他方法  
  185.             //重新检查旧的父节点,当旧的父节点已经不存在子节点的时候,应该重新读取,删除,再加入,保证图标隐藏。  
  186.             treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, oldParent.id);  
  187.             if (treeList != null && treeList.length == 1) {  
  188.                 $.GridUtils.deleteTreeNodeAndChildren(GridConfig, treeList[0].id);  
  189.                 treeList[0]._id_ = oldParent.id;  
  190.                 treeList[0].loaded = true;  
  191.                 treeList[0].isLeaf = true;  
  192.                 //alert("treeList[0]=" + $.toJSON(treeList[0]));  
  193.                 $("#" + GridConfig.divId).jqGrid('addChildNode', treeList[0].id, treeList[0].parentId, treeList[0]);  
  194.             }  
  195.   
  196.         }  
0 0