jqGrid 树网格版本 4.5.2 无法使树正常工作

jqGrid tree grid version 4.5.2 having trouble getting the tree to work

我正在使用 jqGrid 4.5.2 和 jquery 2.2.2。因为它仍然像正常一样显示网格但没有树。在浏览器调试器中挖掘,我发现它正在设置 left:NaNpx; 的样式。我不确定为什么要设置 NaN。如果我手动将其更改为 15px,则会出现箭头,但行不在其下方,单击箭头时也不会隐藏子行。

我的代码:

<table id="TabAdminAgentsGrid" class="scroll" cellpadding="0" cellspacing="0"></table>

var grid = jQuery("#TabAdminAgentsGrid");
grid.jqGrid({
    url: '/Admin/AgentsGrid',
    altRows: true,
    altclass: 'myAltRowClass',
    autowidth: true,
    datatype: 'json',
    mtype: 'POST',
    colNames: ['Agency', 'Name', 'Status', 'City', 'State', 'Contact'],
    colModel: [
        { name: 'AgencyCode', index: 'AgencyCode', width: 18, align: 'left', sortable: true, resizable: true, sorttype: 'text', autoFit: true, stype: 'text' },
        { name: 'AgencyName', index: 'AgencyName', width: 40, align: 'left', sortable: true, resizable: true, classes: 'defaultpointer', sorttype: 'text', autoFit: true, stype: 'text' },
        { name: 'StatusCode', index: 'StatusCode', width: 10, align: 'left', sortable: true, resizable: true, classes: 'defaultpointer', formatter: function (cellvalue, options, rowObject) { if (cellvalue === 'S') { return '<span style="background-color: #e2e0e0; width: 100%;">Suspended</span>'; } else if (cellvalue === 'I') { return '<span style="background-color: #e2e0e0; width: 100%;">Inactive</span>'; } else return 'Active'; } },
        { name: 'City', index: 'City', width: 30, align: 'left', sortable: true, resizable: true, classes: 'defaultpointer' },
        { name: 'State', index: 'State', width: 8, align: 'left', resizable: true, classes: 'defaultpointer' },
        { name: 'ContactName', index: 'ContactName', width: 30, align: 'left', resizable: true, classes: 'defaultpointer' }],
    height: '400px',
    width: '800px',
    treeGrid: true,
    treeGridModel: 'adjacency',
    ExpandColumn: 'AgencyCode',
    cmTemplate: { width: 70 },
    rowNum: 15,
    rowList: [15, 20, 50],
    sortname: "AgencyCode",
    sortorder: "desc",
    viewrecords: true,
    caption: '',
    pager: "#TabAdminAgentsGridPager",
    postData: { searchParam: $("#AdminSearch").val() },

    emptyrecords: "No quotes have been submitted",
    onSelectRow: function (ids) {
        if (ids != null) {
            var data = $("#TabAdminAgentsGrid").getRowData(ids);
            GetAgency(data.AgencyCode);
        }
    },
    loadComplete: function () { $("#TabAdminAgentsGrid").setGridWidth($('#subTabs').width() - 30, true); }

}).navGrid($('#TabAdminAgentsGridPager'), { edit: false, add: false, del: false, search: false });

我的数据,我为单元格和树信息创建了一个 class,为单元格字段创建了一个。代理机构只会比他们低一级:

public class JSONAgent
    {
        public string AgencyCode { get; set; }
        public JSONAgentCell cell { get; set; }
        public string level { get; set; }
        public string parent { get; set; }
        public bool isLeaf { get; set; }
        public bool expanded { get; set; }
        public bool loaded { get; set; }
    }

    public class JSONAgentCell
    {
        public string AgencyCode { get; set; }
        public string AgencyName { get; set; }
        public string StatusCode { get; set; }
        public string City { get; set; }
        public string State { get; set; }
        public string ContactName { get; set; }
    }

List<JSONAgent> agents = new List<JSONAgent>();

        foreach(var agent in agencyRecords)
        {
            JSONAgent ag = new JSONAgent();
            ag.i = agent.AgencyCode;
            ag.cell = new JSONAgentCell();
            ag.cell.AgencyCode = agent.AgencyCode;
            ag.cell.AgencyName = agent.AgencyName;
            ag.cell.StatusCode = agent.StatusCode;
            ag.cell.City = agent.City;
            ag.cell.State = agent.State;
            ag.cell.ContactName = agent.ContactName;

            if(string.IsNullOrWhiteSpace(agent.ParentAgencyCode) || agent.ParentAgencyCode == agent.AgencyCode)
            {
                ag.level = "0";
                ag.parent = null;
                ag.isLeaf = false;
                ag.expanded = false;
                ag.loaded = true;
            }
            else
            {
                ag.level = "1";
                ag.parent = agent.ParentAgencyCode;
                ag.isLeaf = true;
                ag.expanded = false;
                ag.loaded = true;
            }
            agents.Add(ag);
        }

        var jsonData = new
        {
            total = totalPages,
            page = page,
            records = totalrecords,
            rows = agents.ToArray()
        };


        return Json(jsonData);

非常感谢能为我指明正确方向的任何帮助。几天来,我一直在用头撞墙。谢谢你。

编辑:这是传递到网格的 json 的样子(稍微虚拟化了数据):

{
"total": 1,
"page": 1,
"records": 4595,
"rows": [
    {
        "AgencyCode": "077112",
        "cell": {
            "AgencyCode": "077112",
            "AgencyName": "Person McPerson",
            "StatusCode": "A",
            "City": "Stockton",
            "State": "CA",
            "ContactName": "Person McPerson"
        },
        "level": "0",
        "parent": null,
        "isLeaf": false,
        "expanded": false,
        "loaded": true
    },
    {
        "AgencyCode": "077112-1",
        "cell": {
            "AgencyCode": "077112-1",
            "AgencyName": "Anon Plus Insurance",
            "StatusCode": "A",
            "City": "Stockton",
            "State": "CA",
            "ContactName": "Person McPerson"
        },
        "level": "1",
        "parent": "077112",
        "isLeaf": true,
        "expanded": false,
        "loaded": true
    }
    ]
}

要解决此问题,您需要配置 jsonReader。您回复中的单元格 属性 是 jsonReader 中的保留字。 cell 在 repeatitems 为真时使用,但在您的情况下您不需要 repeatitems。由于网格尝试自动检测重复项,它会找到 cell 属性,但 cell 不是数组 - 它是对象。 您需要将 jsonReader 中的 repeatitems 显式设置为 false。

有很多解决方案(我在4.5.2版本测试过,都有效)

1.in 网格选项

grid.jqGrid({
    ...
    jsonReader : {
        repeatitems : false
    },
    ...
});

2.In response 而不是 属性 cell 写一些其他的词,比如 cells

一些注意事项:为了一切正确,您需要在 jsonReader 中设置唯一 ID,或者在 colModel 中设置为 key: true 属性。 在 colModel 中设置 jsonmap 也是一个好主意。

文档中描述了所有这些属性。