`

jqGrid的树形表格:treeGrid

 
阅读更多
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
----------------------------------
{
    "total":11,
    "page":1,
    "records":11,
    "rows":[
        {"id":1, "name":"Pandy1", "cell":["第一级1",0,null,false,false]},
        {"id":3, "name":"Pandy2", "cell":["第二级1",1,1,true,false]},
        {"id":2, "name":"Pandy3", "cell":["第一级2",0,null,true,false]}
    ]
}


<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<%@ include file="/common/taglibs.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Insert title here</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script type="text/javascript" src="<c:url value="/pages/org/grid.treegrid.js"/>"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            $("#treegrid").jqGrid({
                treeGrid: true,
                treeGridModel: 'adjacency',
                ExpandColumn: 'name',
                ExpandColClick: true,
                url: '/pages/demo/tree.json',
                datatype: 'json',
                colNames: ["管理选项"],
                colModel: [
                    { name: 'name', index: 'name' }
                ],
                pager: "false",
                height: 'auto',
                width: '210',
                viewrecords: true,
                //   caption: 'none',
                jsonReader: {
                    root: "rows",
                    total: "total",
                    repeatitems: true
                }

            });
        })
        ;
    </script>

</head>
<body>
<table id="treegrid"></table>
<div id="ptreegrid"></div>
</body>
</html>



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


<%@ page language="java" contentType="text/html;charset=utf-8" pageEncoding="utf-8" %>
<%@ include file="/common/taglibs.jsp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <title>Insert title here</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <script type="text/javascript" src="<c:url value="/pages/org/grid.treegrid.js"/>"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            jQuery("#treegrid").jqGrid({
                treeGrid: true,
                treeGridModel: 'adjacency', //treeGrid模式,跟json元数据有关 ,adjacency/nested
                ExpandColumn : 'username',
                scroll: "true",
                url: '/pages/demo/tree1.json',
                datatype: 'json',
                colNames:['编号','姓名','密码','年龄','地址','出生日期'],
                colModel:[
                    {name:'id',index:'id', width:90,sorttype:"int"},
                    {name:'username',index:'username', width:110,sorttype:"int"},
                    {name:'password',index:'password', width:80},
                    {name:'age',index:'age', width:80},
                    {name:'address',index:'address', width:80},
                    {name:'time',index:'time', width:80,sorttype:"date"}
                ],
                pager: "false",
                sortname: 'id',
                sortorder: "desc",

                jsonReader: {
                    root: "dataRows",
                    repeatitems : false
                },
                treeReader : {
                    level_field: "level",
                    parent_id_field: "parent",
                    leaf_field: "isLeaf",
                    expanded_field: "expanded"
                },
                caption: "jqGrid test",
                mtype: "POST",
                height: "auto",    // 设为具体数值则会根据实际记录数出现垂直滚动条
                rowNum : "-1",     // 显示全部记录
                shrinkToFit:false  // 控制水平滚动条
            });
        });
    </script>

</head>
<body>
<table id="treegrid"></table>
</body>
</html>





一些自己实现的方法
/* 以下是常用的方法 */
        /**
         * 设定默认关闭的等级,同时自动关闭它的下一级
         * 这里递归,出现错误
         * @param GridConfig
         * @param level
         */
        /* --------------------------- tree grid for jqGrid ------------------------------- */
        setDefaultOpenLevel: function (GridConfig, level) {
            var childRows = $("#" + GridConfig.divId).jqGrid('getRootNodes');
            for (var i = 0; i < childRows.length; i++) {
                var rows = $("#" + GridConfig.divId).jqGrid('getNodeChildren', childRows[0]);
                for (var m = 0; m < rows.length; m++) {
                    if (rows[m].level <= level) {
                        $("#" + GridConfig.divId).jqGrid('collapseNode', rows[m]);
                        $("#" + GridConfig.divId).jqGrid('collapseRow', rows[m]);
                    }

                    //遍历导致浏览器崩溃,所以多做一次循环,进入深一层继续关闭就好.
                    var trows = $("#" + GridConfig.divId).jqGrid('getNodeChildren', rows[m]);
                    for (var k = 0; k < trows.length; k++) {
                        if (trows[k].level <= (level + 1)) {
                            $("#" + GridConfig.divId).jqGrid('collapseNode', trows[k]);
                            $("#" + GridConfig.divId).jqGrid('collapseRow', trows[k]);
                        }
                    }
                }
            }
        },
        /**
         * 展开某个节点的所有父节点
         * @param GridConfig
         * @param id
         */
        openParentsNode: function (GridConfig, rowid) {
            var currNode = $.GridUtils.getCurrentNode(GridConfig, rowid);
            currNode.parentId=""+currNode.parentId;
            var parent = $("#" + GridConfig.divId).jqGrid('getNodeParent', currNode);
            if (parent != null) {
                $("#" + GridConfig.divId).jqGrid('expandNode', parent);
                $("#" + GridConfig.divId).jqGrid('expandRow', parent);
                $.GridUtils.openParentsNode(GridConfig, parent.id);
            }
        },
        getAllChildrenNodes: function (GridConfig, root, level, treeList) {
            if (typeof treeList == "undefined") {
                treeList = [];
            }
            var chs = $("#" + GridConfig.divId).jqGrid('getNodeChildren', root);
            treeList[treeList.length] = root;

            if (chs != null && chs.length > 0) {
                for (var i = 0; i < chs.length; i++) {
                    $.GridUtils.getAllChildrenNodes(GridConfig, chs[i], level + 1, treeList);
                }
            }
            return treeList;
        },
        /**
         * 自己实现获得父节点方法
         * @param GridConfig
         * @param rowid
         * @returns {*}
         */
        getNodeParent: function (GridConfig, rowid) {
            var roots = $("#" + GridConfig.divId).jqGrid('getRootNodes');
            var row = $.GridUtils.getRowData(GridConfig, rowid);

            for (var i = 0; i < roots.length; i++) {
                var treeList = $.GridUtils.getAllChildrenNodes(GridConfig, roots[i], 0);
                for (j = 0; j < treeList.length; j++) {
                    if (treeList[j].id == row.parentId) {
                        return  treeList[j]
                    }
                }
            }

            return null;
        },
        /**
         * 自己实现获得当前节点方法
         * @param GridConfig
         * @param rowid
         * @returns {*}
         */
        getCurrentNode: function (GridConfig, rowid) {
            var roots = $("#" + GridConfig.divId).jqGrid('getRootNodes');
            var row = $.GridUtils.getRowData(GridConfig, rowid);

            for (var i = 0; i < roots.length; i++) {
                var treeList = $.GridUtils.getAllChildrenNodes(GridConfig, roots[i], 0);
                for (j = 0; j < treeList.length; j++) {
                    if (treeList[j].id == row.id) {
                        return  treeList[j]
                    }
                }
            }

            return null;
        },
        /**
         * 第一个节点是当前节点,第二个以及后面的,属于它的子节点
         * @param GridConfig
         * @param rowid
         * @returns {*}
         */
        getAllChildrenNodesByRowId: function (GridConfig, rowid) {
            var row = $.GridUtils.getRowData(GridConfig, rowid);
            row._id_ = row.id;
            var rowList = $.GridUtils.getAllChildrenNodes(GridConfig, row, row.level);
            if (rowList == null || rowList.length == 0)
                return rowList;

            if (rowList != null && rowList.length > 0) {
                //替换当前节点
                rowList[0] = $.GridUtils.getCurrentNode(GridConfig, rowid);
            }
            return rowList;

        },
        /**
         * 自己实现的删除节点以及子节点,注意,先从叶子删除
         * @param GridConfig
         * @param rowid
         */
        deleteTreeNodeAndChildren: function (GridConfig, rowid) {
            var treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, rowid);
            //先删除子节点再删除当前节点
            for (var i = treeList.length - 1; i >= 0; i--) {
                if (treeList[i] != null)
                    $("#" + GridConfig.divId).jqGrid('delTreeNode', treeList[i].id);
            }
        },
        /**
         * 移动一个节点到另一个节点
         * @param GridConfig
         * @param newNodeData
         */
        moveTreeNode: function (GridConfig, newNodeData) {
            if (typeof(newNodeData.parentId) == "undefined") {
                alert("没有设定父节点ID");
                return;
            }
            var levelPad = 0;  //用于校对心节点的level
            var rowid = typeof(newNodeData.rowid) == "undefined" ? newNodeData.id : newNodeData.rowid;
            var newParentId = newNodeData.parentId;
            var newParent;
            var oldParent;
            //获得之前的当前节点以及所有子节点
            var treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, rowid);
            //alert("treeList=" + $.toJSON(treeList));
            if (treeList != null && treeList.length > 0) {
                newParent = $.GridUtils.getCurrentNode(GridConfig, newParentId);
                oldParent = $.GridUtils.getCurrentNode(GridConfig, treeList[0].parentId);
                //新旧的父节点的level差量
                if (newParent != null) {
                    //levelPad = newParent.level - treeList[0].level;
                    levelPad = newParent.level - oldParent.level;
                }
                //alert("newParent="+ $.toJSON(newParent));
                //alert("oldParent="+ $.toJSON(oldParent));
                //alert("levelPad="+ levelPad);
            }

            //删除当前节点以及所有子节点
            $.GridUtils.deleteTreeNodeAndChildren(GridConfig, rowid);
            //alert("deleteTreeNodeAndChildren");

            //更新当前节点的业务信息
            treeList[0] = $.extend(treeList[0], newNodeData);

            for (var i = 0; i < treeList.length; i++) {
                treeList[i]._id_ = treeList[i].id;
                treeList[i].loaded = true;
                //新旧的父节点的level差量 + 1,就是当前节点应该的level
                treeList[i].level = treeList[i].level + levelPad;
                //alert("treeList[i]=" + $.toJSON(treeList[i]));
                $("#" + GridConfig.divId).jqGrid('addChildNode', treeList[i].id, treeList[i].parentId, treeList[i]);
            }
            $.GridUtils.openParentsNode(GridConfig, treeList[0].id);

            //return;

            //旧的父节点不存在子节点的时候,无法隐藏图标,另求其他方法
            //重新检查旧的父节点,当旧的父节点已经不存在子节点的时候,应该重新读取,删除,再加入,保证图标隐藏。
            treeList = $.GridUtils.getAllChildrenNodesByRowId(GridConfig, oldParent.id);
            if (treeList != null && treeList.length == 1) {
                $.GridUtils.deleteTreeNodeAndChildren(GridConfig, treeList[0].id);
                treeList[0]._id_ = oldParent.id;
                treeList[0].loaded = true;
                treeList[0].isLeaf = true;
                //alert("treeList[0]=" + $.toJSON(treeList[0]));
                $("#" + GridConfig.divId).jqGrid('addChildNode', treeList[0].id, treeList[0].parentId, treeList[0]);
            }

        }
分享到:
评论

相关推荐

    基于jqgrid实现树形菜单分页列表查询

    jqGrid允许将数据组织成树状结构,通过配置`treeGrid: true`开启树形模式。每一行数据都可以有父节点和子节点,通过`parent`字段指定父节点ID,而`id`字段作为唯一标识。`ExpandColumn`则定义了用于展开/折叠节点的...

    jqGrid5.3.1(grid,treegrid) 2018官方最新版本

    - **TreeGrid(树形网格)**:jqGrid的5.3.1版本包含了TreeGrid功能,允许以树状结构展示数据,这对于层级关系复杂的数据尤为适用,用户可以展开或折叠节点,查看层次关系。 - **编辑功能**:提供了行内编辑、弹出...

    jqgrid 的treegrid用法

    **jqGrid TreeGrid 详解** jqGrid 是一个强大的 ...通过理解其配置选项、动态操作方法以及事件处理,开发者可以创建出符合业务需求的交互式树形表格。在实际项目中,可以根据具体场景灵活调整参数,实现定制化功能。

    jqgrid treegrid功能的bug修改

    可先参考下我的博客:http://blog.csdn.net/qq805911956/article/details/51262506

    基于vuejs实现树形表格的封装vuetreetable

    在处理复杂的数据展示时,树形表格是一种常见的需求,它能够以层次结构来展示数据,使得数据的组织更为清晰。本教程将详细介绍如何基于Vue.js实现一个自定义的树形表格组件——vue-tree-table。 首先,我们需要了解...

    bootstrap-table+treegrid实现树形表格

    实现一个树形表格的时候有多种方法:比如把 ztree 的树形直接拼接成表格,或者用强大的 jqgrid 实现,今天介绍一个比较轻量级的实现:使用bootstrap-table + treegrid 。 1、引入 jquery.js、bootstrap-table.js、...

    TreeGrid树状表格

    TreeGrid树状表格是一种特殊的表格展示方式,它将数据以树形结构呈现,适用于处理具有层级关系的数据。这种表格能够帮助用户更清晰地理解和操作层次化的信息,常用于项目管理、组织架构、文件目录等场景。 在...

    jqGrid插件--JQuery表格插件

    9. **插件扩展**:jqGrid有丰富的插件系统,如`subgrid`用于嵌套表格,`treegrid`实现树形结构,`navigator`提供额外的操作按钮等。在`plugins`目录下的文件即为这些插件的实现。 10. **版本更新与社区支持**:...

    jqGrid_各种参数_详解

    * treeGrid:设置表格的树形网格。 * treeGridModel:设置表格的树形网格模型。 * viewrecords:设置表格的查看记录功能。 * width:设置表格的宽度。 这些参数可以根据需要进行配置,以满足不同的数据显示需求。 ...

    jquery.jqgrid最新版

    3. 树形结构:通过`treeGrid`配置项和相关方法,可以展示层次化数据。 4. 行选择:支持单行、多行和全选,可通过`selarrrow`获取选中行数据。 5. 表格事件:包括`loadComplete`、`clickRow`、`beforeSelectRow`等...

    jquery.jqGrid-4.3.2.zip

    - **plugins**:插件目录存放了扩展jqGrid功能的各种插件,如`subgrid`用于子网格,`treegrid`用于树形结构展示,`navigator`提供额外的导航按钮,如添加、删除、编辑等。 - **js**:JavaScript代码的核心部分,...

    jqgrid的tree实例

    1. **启用树形视图**:在jqGrid配置中,需设置`treeGrid: true`来开启树形视图模式。同时,`ExpandColumn`属性定义了展开/折叠节点的列,而`treeGridModel`定义了树的扩展方式,通常可选"nested"(嵌套)或...

    jqGrid 5.3全演示包

    这个"jqGrid 5.3全演示包"包含了jqGrid的最新版本v5.3.1,以及与之相关的多个组件的演示示例,如bootstrap集成、pivotgrid(行转列)和treegrid(树形结构表格)。这些演示将帮助开发者更好地理解和使用jqGrid的各种...

    深入研究jqgrid

    - jqGrid的插件如`jqGrid TreeGrid`允许创建树形结构的表格,用于展示层级关系的数据。 - `jqGrid SubGrid`可以为每一行添加展开/折叠子表格的功能,便于查看详细信息。 - `jqGrid Form Editing`提供了弹出式或内联...

    jqGrid_API中文

    除了基本功能,jqGrid还有许多第三方扩展,如`jqGrid Footer`(添加表格底部行)、`jqGrid Subgrid`(子表格)和`jqGrid TreeGrid`(树形结构表格)等,这些扩展增强了jqGrid的功能和适用性。 ### 6. 版本更新与...

    TreeGrid 在Asp.net中实现的实例

    例如,使用jQuery UI的`nestedSortable`插件可以创建可排序的树形表格。 实现步骤: 1. **设计HTML和服务器端控件** 在ASP.NET页面上,我们需要添加对应的TreeGrid控件,并设置必要的属性。如果是使用JavaScript...

    Guriddo_jqGrid_JS_5.3.1.zip

    总的来说,Guriddo_jqGrid_JS_5.3.1.zip是一个全面的jqGrid资源包,不仅提供了基本的表格功能,还支持Bootstrap风格、行转列分析(pivotgrid)和树形结构(treegrid)等功能。开发者可以通过解压这个压缩包,研究...

    jqGrid属性中文详细说明

    **描述:** 设置用于展开树形结构的列名。 **属性详情:** - **类型**: String - **默认值**: `null` - **兼容性**: - 仅当`treeGrid`设置为`true`时才有效。 ##### 23. `footerrow` (footerrow) **描述:** 设置...

    jqGrid 3.7

    4. **JavaScript 插件**:“js”目录可能包含jqGrid的额外插件或扩展,比如树形结构的支持(treegrid)、行内编辑模式(inline editing)、弹出式编辑对话框(form editing)等,这些插件增强了jqGrid的功能性。...

Global site tag (gtag.js) - Google Analytics