在jqgrid中使用JSON数据的Treegrid

6 jquery jqgrid

我正在测试jqgrid中的树,到目前为止我只能创建类似下面的内容

在此输入图像描述

我想要像jqGrid Demo页面那样的东西

我提出了下面的代码,但不知道我应该如何从给定的json格式扩展树中的每一行

$('<table id="list2" cellspacing="0" cellpadding="0"></table></div>').appendTo('#topics');

var grid = jQuery("#list2");
grid.jqGrid({
    datastr:topicjson,
    datatype: "jsonstring",
    height: "auto",
    pager: false,
    loadui: "disable",
    colNames: ["id","Items","url"],
    colModel: [
        {name: "id",width:1,hidden:true, key:true},
        {name: "elementName", width:150, resizable: false},
        {name: "url",width:1,hidden:true}
    ],
    treeGrid: true,

    caption: "jqGrid Demos",
    ExpandColumn: "elementName",
    autowidth: true,
    //width: 180,
    rowNum: 200,
    //ExpandColClick: true,
    treeIcons: {leaf:'ui-icon-document-b'},
    jsonReader: {
        repeatitems: false,
        root: "response"
    }
});
Run Code Online (Sandbox Code Playgroud)

Json格式

var topicjson={
    "response": [
                 {
                     "id": "1",
                     "elementName": "Grouping",
                     "sub": [
                         {
                             "subelementName": "Simple Grouping"
                         },
                         {
                             "subelementName": "May be some other grouping"
                         }
                     ]
                 },
                 {
                     "id": "2",
                     "elementName": "CustomFormater",
                     "sub": [
                         {
                             "subelementName": "Image Formatter"
                         },
                         {
                             "subelementName": "Anchor Formatter"
                         }
                     ]
                 }
             ]
         };
Run Code Online (Sandbox Code Playgroud)

Ole*_*leg 10

您尝试使用绝对错误的格式化数据的树网格.您应该将树网格看作一个网格,其中包含一些用于定义树结构的其他隐藏列.列的名称取决于treeGridModel参数的值.我建议你使用treeGridModel: "adjacency".在这种情况下,隐藏列的名称将是:

level, parent, isLeaf, expanded, loaded, icon
Run Code Online (Sandbox Code Playgroud)

在treeGridModel:'嵌套'的情况下,有lftrgt不是parent列.

因为树的每个项目(根节点和所有子项)都表示将放置在网格中的网格行,每个项目都必须具有id.在您的topicjson变量的原始版本中,您仅为根元素(级别0的元素)定义了ID.

我们可以将您的原始示例修改为以下内容:

var topicjson={
    "response": [
           {
               "id": "1",
               "elementName": "Grouping",
               level:"0", parent:"", isLeaf:false, expanded:false, loaded:true
           },
           {
               "id": "1_1",
               "elementName": "Simple Grouping",
               level:"1", parent:"1", isLeaf:true, expanded:false, loaded:true
           },
           {
               "id": "1_2",
               "elementName": "May be some other grouping",
               level:"1", parent:"1", isLeaf:true, expanded:false, loaded:true
           },
           {
               "id": "2",
               "elementName": "CustomFormater",
               level:"0", parent:"", isLeaf:false, expanded:true, loaded:true
           },
           {
               "id": "2_1",
               "elementName": "Image Formatter",
               level:"1", parent:"2", isLeaf:true, expanded:false, loaded:true
           },
           {
               "id": "2_1",
               "elementName": "Anchor Formatter",
               level:"1", parent:"2", isLeaf:true, expanded:false, loaded:true
           }
       ]
    },
    grid;

$('<table id="list2"></table>').appendTo('#topics');

grid = jQuery("#list2");
grid.jqGrid({
    datastr: topicjson,
    datatype: "jsonstring",
    height: "auto",
    loadui: "disable",
    colNames: [/*"id",*/"Items","url"],
    colModel: [
        //{name: "id",width:1, hidden:true, key:true},
        {name: "elementName", width:250, resizable: false},
        {name: "url",width:1,hidden:true}
    ],
    treeGrid: true,
    treeGridModel: "adjacency",
    caption: "jqGrid Demos",
    ExpandColumn: "elementName",
    //autowidth: true,
    rowNum: 10000,
    //ExpandColClick: true,
    treeIcons: {leaf:'ui-icon-document-b'},
    jsonReader: {
        repeatitems: false,
        root: "response"
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看演示中的修改结果:

在此输入图像描述

在示例中,我expanded:trueCustomFormater节点设置了属性,以演示您可以指定应直接显示扩展的节点.

id从树网格中删除了隐藏列,因为id将另外保存为id相应<td>元素的属性.如果您不打算使列可见,我建议id仅将属性放在树的输入数据中(in topicjson).

还有一个重要的评论.所有网格行的填充顺序与输入数据中的顺序完全相同.因此,您必须在其父节点之后立即放置节点的子节点.我在trirand论坛中放置了相应的更改请求.因此,关于树网格的输入数据的严格顺序的要求可能稍后会在某处更改.

更新:要正确排序,必须使用parent:nullparent:"null"代替parent:""查看此处了解更多详细信息.