jqgrid форматирование сложного объекта

У меня есть функция в коде моего сервера, которая возвращает список 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 в одном столбце. Моя colModel выглядит следующим образом:

$("#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
});

а затем определили YearDataFormatter функция как следовать:

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 функционировать значение cellvalue параметр не определен, в то время как, глядя на него с помощью отладчика, внутри rowObject параметр.

Как я могу правильно получить доступ к значению этой ячейки?

Кроме того, есть ли возможность изменить заголовок для определенного столбца? Я хотел бы создать заголовок из двух строк, но если я добавлю разметку внутри colNames Опция высота заголовка не изменяется соответственно.

Спасибо за вашу поддержку!

1 ответ

Решение

Вы не разместили данные JSON или XML, которые используются для заполнения сетки и определения jqGrid. Локальные данные или в случае использования 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;
};

Лучше всего было бы изменить формат данных, которые сервер использует для date и использовать формат даты ISO 8601. Если вы используете.NET, вы можете использовать "o" или "O" форматирования DateTime, В случае, если вы можете использовать formatter:'date' или же formatter:'date', formatoptions:{srcformat:'ISO8601Long'},

ОБНОВЛЕНО: Я уверен, что вы используете гораздо больше настроек по умолчанию в определении jqGrid. Без дополнительных настроек вы не сможете прочитать данные JSON. После небольшой модификации демо-версия прочитала данные, и я не вижу никаких проблем с пользовательским форматером, который вы используете: см. Здесь:

Вы можете сравнить демо с молодежью, чтобы увидеть различия.

О вашем втором вопросе (многострочные данные в заголовке сетки) я рекомендую посмотреть здесь:

Другие вопросы по тегам