3

我正在使用 jqGrid treegrid,我想根据单元格中数据的值(它是一个整数)来格式化列的背景颜色:

这是我设置列的示例:

             {
                 name: 'missingBooks',
                 cellattr: function (rowId, tv, rawObject, cm, rdata) {

                 //conditional formatting
                     if (rawObject[11] > 0) {
                         return 'style="background-color:#FFCCCC"';
                     }
                 },
                 width: 75,
                 unformat: originalValueUnFormatter,
                 formatter: missingBooksFormatter,
                 align: "right",
                 index: 'missingBooks',
                 hidden: false,
                 sorttype: 'int',
                 sortable: true
             },

这很好用,但我的问题出在 cellAttr 回调中。在此条件格式行中:

      if (rawObject[11] > 0) {
                         return 'style="background-color:#FFCCCC"';
                     }

我想重用这个逻辑,所以我不想索引 rawObject 并找出我正在使用的列。我希望有办法做这样的事情:

       if (rawObject.missingBooks > 0) {
                         return 'style="background-color:#FFCCCC"';
                     }

但这似乎是未定义的。这样,如果我添加一个新列,我就不必重新索引所有这些条件格式代码。

4

1 回答 1

2

我明白这个问题。我建议 Tony 对 jqGrid 代码进行一些更改。大多数情况下,修改代码中的位置以首先填充rd然后在下一个 for 循环调用addCellrd作为附加参数就足够了。该函数addCell可以将信息转发到formatCol并且formatCol可以cellattr使用附加参数调用,rd该参数将具有与您想要的完全相同格式的信息。

然而,无需对 jqGrid 代码进行任何更改,就可以相对容易地获得几乎相同的结果。为此,只需构造地图对象,该对象可以rawObject根据名称为我们提供列的索引。

例如,如果地图尚未填充,我们可以使用beforeRequest或来填充地图。beforeProcessing代码看起来像

var colMap = {};
$("#tree").jqGrid({
    ...
    colModel: [
        {name: 'missingBooks',
            cellattr: function (rowId, tv, rawObject, cm, rdata) {
                //conditional formatting
                 if (Number(rawObject[colMap.missingBooks]) > 0) {
                     return ' style="background-color:#FFCCCC"';
                 } else {
                     return '';
                 }
            }
            ...
    ],
    beforeRequest: function () {
        if ($.isEmptyObject(colMap)) {
            var i, cmi,
                cm = $(this).jqGrid('getGridParam', 'colModel'),
                l = cm.length;
            for (i = 0; i < l; i++) {
                cmi = cm[i];
                colMap[cmi.name] = i;
            }
        }
    }
});

因此,代码将不会使用索引,例如在代码中进行一些修改后可以更改rawObject[11]索引的位置。11

您可以在此处查看相应的演示。

于 2012-01-07T23:51:18.643 回答