Jquery jqgrid格式化复杂对象

Jquery jqgrid格式化复杂对象,jquery,jqgrid,jqgrid-formatter,Jquery,Jqgrid,Jqgrid Formatter,我的服务器代码中有一个函数,返回ElementRow对象列表: public class ElementRow { public string AreaName { get; set; } public YearData CurrentYear { get; set; } public YearData PreviousYear { get; set; } } public class YearData { public int Value1 { get; se

我的服务器代码中有一个函数,返回
ElementRow
对象列表:

public class ElementRow {
    public string AreaName { get; set; }
    public YearData CurrentYear { get; set; }
    public YearData PreviousYear { get; set; }
}

public class YearData {
    public int Value1 { get; set; }
    public int Value2 { get; set; }
}
这些类生成一个json,如下所示:

{"d":
    {
        "Total":2,
    "Page":1,
    "Records":30,
    "Rows":[
        {"AreaID":0,"CurrentYear":{"Value1":1,"Value2":2},"PreviousYear":{"Value1":1,"Value2":2}},
        {"AreaID":1,"CurrentYear":{"Value1":5,"Value2":4},"PreviousYear":{"Value1":1,"Value2":2}},
        {"AreaID":2,"CurrentYear":{"Value1":2,"Value2":1},"PreviousYear":{"Value1":1,"Value2":2}},
        {"AreaID":3,"CurrentYear":{"Value1":1,"Value2":3},"PreviousYear":{"Value1":1,"Value2":2}}
    ],
    "UserData":null
    }
}
我已经定义了colModel以支持此数据结构,并希望创建一个自定义格式化程序函数,以在一列中格式化
YearData
类型的对象。我的模型如下:

$("#dashboard").jqGrid({
    url: wsBaseUrl + 'MyWebService.asmx/MyMethod',
    colNames: ['Area Name','Current Year', 'Previous Year'],
    colModel: [
        { name: 'AreaName', index: 'AreaName', width: 120, template: colTextTemplate },
        { name: 'CurrentYear', index: 'CurrentYear', width: 100, align: 'center', sortable: false, formatter: YearDataFormatter },
        { name: 'PreviousYear', index: 'PreviousYear', width: 100, align: 'center', sortable: false, formatter: YearDataFormatter }
    ],
    jsonReader: {
        id: "AreaID"
    },
    pager: $('#dashboard_pager'),
    sortname: 'AreaName',
    sortorder: "asc",
    height: '250',
    rownumbers: false,
    gridview: false,
    subGrid: true,

    //subgrid definition omitted
});
function YearDataFormatter(cellvalue, options, rowObject) {
    var table = "<table><tr>";
    table += "<td>" + cellvalue.Value1 + "</td>";
    table += "<td>" + cellvalue.Value2 + "</td>";
    table += "</tr></table>";
    return table;
}; 
然后将
YearDataFormatter
函数定义如下:

$("#dashboard").jqGrid({
    url: wsBaseUrl + 'MyWebService.asmx/MyMethod',
    colNames: ['Area Name','Current Year', 'Previous Year'],
    colModel: [
        { name: 'AreaName', index: 'AreaName', width: 120, template: colTextTemplate },
        { name: 'CurrentYear', index: 'CurrentYear', width: 100, align: 'center', sortable: false, formatter: YearDataFormatter },
        { name: 'PreviousYear', index: 'PreviousYear', width: 100, align: 'center', sortable: false, formatter: YearDataFormatter }
    ],
    jsonReader: {
        id: "AreaID"
    },
    pager: $('#dashboard_pager'),
    sortname: 'AreaName',
    sortorder: "asc",
    height: '250',
    rownumbers: false,
    gridview: false,
    subGrid: true,

    //subgrid definition omitted
});
function YearDataFormatter(cellvalue, options, rowObject) {
    var table = "<table><tr>";
    table += "<td>" + cellvalue.Value1 + "</td>";
    table += "<td>" + cellvalue.Value2 + "</td>";
    table += "</tr></table>";
    return table;
}; 
函数YearDataFormatter(单元格值、选项、行对象){
var表=”;
表+=“”+cellvalue.Value1+“”;
表+=“”+cellvalue.Value2+“”;
表+=”;
返回表;
}; 
无论如何,当我尝试执行此函数时,问题是在
YearDataFormatter
函数中,
cellvalue
参数的值未定义,而使用调试器查看时,
rowObject
参数中有一个有效值

如何正确访问该单元格的值

此外,是否有机会修改特定列的标题?我想创建两行标题,但如果在
colNames
选项中添加标记,标题高度不会相应更改


谢谢你的支持

您不会发布用于填充网格和jqGrid定义的JSON或XML数据。本地数据或在使用
loadone:true
的情况下,将保存内部数据,并以其他方式工作。因此,应根据设置使用自定义格式化程序

因为我没有足够的信息,我试着猜测。我想你应该用

function YearDataFormatter(cellvalue, options, rowObject) {
    var table = "<table><tr>",
        cellData = rowObject.CurrentYear; // or like rowObject[2]
    table += "<td>" + cellData.Value1 + "</td>";
    table += "<td>" + cellData.Value2 + "</td>";
    table += "</tr></table>";
    return table;
};
函数YearDataFormatter(单元格值、选项、行对象){
var表=”,
cellData=rowObject.CurrentYear;//或类似于rowObject[2]
表+=“”+cellData.Value1+“”;
表+=“”+cellData.Value2+“”;
表+=”;
返回表;
};
最好是更改服务器用于
日期的数据格式,并使用ISO 8601日期格式。如果您使用.NET,则可以使用
DateTime
。在这种情况下,您可以使用
formatter:'date'
formatter:'date',formattoptions:{srcformat:'ISO8601Long'}

已更新:我确信您在jqGrid定义中使用了更多的默认设置。如果没有其他设置,则无法读取JSON数据。经过小的修改后,演示程序读取了数据,我发现您使用的自定义格式化程序没有任何问题:请参阅:

您可以将演示与youth进行比较以了解差异


关于第二个问题(网格标题中的多行数据),我建议您查看:

请注意,我已经编辑了我的问题,添加了网格定义以及从服务器返回的JSON。您的建议非常有效,不幸的是,它不允许我在两个列中都使用通用格式化程序。最后,现在您可以看到json数据,您将看到它不是DateTime类型的数据。谢谢你的支持。是的,第一个问题我的代码中有一个小错误。第二个:太好了!