jqGrid:根据列名称的行单元格值更改行的背景颜色

And*_*rus 9 javascript jqgrid

jqGrid有一个名为Posted的列.根据客户如何配置网格,它可以定位在不同的位置,但始终保持不变.

如果已发布列的值为True,我需要更改行的背景颜色

我在下面尝试了colmodel但是alert(rdata.Posted)显示总是未定义.

如果此行中的已发布列的值为true,如何更改行的背景颜色?

我查看了许多Oleg和其他改变背景颜色的解决方案,但他们使用的是硬编码列号.

colModel: [

{"cellattr":function(rowId, tv, rawObject, cm, rdata) {  
if (rdata.Posted)
    return 'class="jqgrid-readonlycolumn"';
    return '';
      }
  ,"label":"Klient","name":"Klient_nimi","classes":null,"hidden":false},


{"label":null,"name":"Posted","editable":true,"width":0,
"classes":null,"hidden":true}],
...
Run Code Online (Sandbox Code Playgroud)

更新

在update2中,Oleg建议使用rowattr.我还需要在操作列中隐藏内联删除按钮和自定义发布按钮.我在loadComplete下面是usijng代码.如何使用rowattr实现这一点?

var LoadCompleteHandler = function () {
    var iCol = getColumnIndexByName($grid, 'Kinnitatud'),
      postedDateCol = getColumnIndexByName($grid, 'Kinkuup'),
      cRows = $grid[0].rows.length,
      iRow,
      row,
      className,
      isPosted,
      mycell,
      mycelldata,
      i, count,
      cm = $grid.jqGrid('getGridParam', 'colModel'),
      l,
      iActionsCol = getColumnIndexByName($grid, '_actions');
    l = cm.length;
    if (iCol > 0 || postedDateCol > 0) {
        for (iRow = 0; iRow < cRows; iRow = iRow + 1) {
            row = $grid[0].rows[iRow];
            className = row.className;
            isPosted = false;
            if ($.inArray('jqgrow', className.split(' ')) > 0) { // $(row).hasClass('jqgrow')
                if (iCol > 0) {
                    isPosted = $(row.cells[iCol]).find(">div>input:checked").length > 0;
                }
                if (postedDateCol > 0) {
                    mycell = row.cells[postedDateCol];
                    mycelldata = mycell.textContent || mycell.innerText;
                    isPosted = mycelldata.replace(/^\s+/g, "").replace(/\s+$/g, "") !== "";
                }

                if (isPosted) {
                    if ($.inArray('jqgrid-postedrow', className.split(' ')) === -1) {
                        row.className = className + ' jqgrid-postedrow';
                        $(row.cells[iActionsCol]).find(">div>div.ui-inline-del").hide();
                        $(row.cells[iActionsCol]).find(">div>div.ui-inline-post").hide();
                    }
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

Ole*_*leg 13

更改行的背景颜色的主要想法,您将在此处此处找到.我建议你阅读这个答案,讨论不同方法的不同优点和缺点.

要从列名称获取列索引,您可以使用以下简单函数:

var getColumnIndexByName = function(grid, columnName) {
        var cm = grid.jqGrid('getGridParam','colModel'),i=0,l=cm.length;
        for (; i<l; i++) {
            if (cm[i].name===columnName) {
                return i; // return the index
            }
        }
        return -1;
    };
Run Code Online (Sandbox Code Playgroud)

该函数getColumnIndexByName($("#list"), 'MyColumnName')将获取colModel"MyColumnName"列的索引.

要更改背景颜色,您可以按照示例进行操作

loadComplete: function() {
    $("tr.jqgrow:odd").addClass('myAltRowClass');
}
Run Code Online (Sandbox Code Playgroud)

答案,但':odd'你可以使用jQuery.filter自己编写过滤器,而不是过滤器.在过滤器内部,您可以使用:nth-​​child()来访问相应<td>元素的数据(参见此处)

更新:您可以执行以下操作(非常接近另一个答案的代码):

loadComplete: function() {
    var iCol = getColumnIndexByName($(this),'closed'),
        cRows = this.rows.length, iRow, row, className;

    for (iRow=0; iRow<cRows; iRow++) {
        row = this.rows[iRow];
        className = row.className;
        if ($.inArray('jqgrow', className.split(' ')) > 0) {
            var x = $(row.cells[iCol]).children("input:checked");
            if (x.length>0) {
                if ($.inArray('myAltRowClass', className.split(' ')) === -1) {
                    row.className = className + ' myAltRowClass';
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

相应的演示在这里.您将看到以下内容:

在此输入图像描述

顺便说一句,如果"隐藏"列将被隐藏,一切都将继续像以前一样工作.

更新2:答案描述了如何使用rowattr回调来简化解决方案并获得最佳性能(如果是gridview: true).

  • @Andrus:对不起,但语句是什么语言`posted = row.cells [postedDateCol] .textContent.toString().trim()!=""`写的?我建议你使用`var mycell = row.cells [postedDateCol],mycelldata = mycell.textContent || mycell.innerText; if(mycelldata ===""){/*在空数据的情况下执行某些操作*/}`.`mycell`将是`<td>`的DOM元素.某些Web浏览器仅支持`textContent`属性.另一个浏览器仅支持`innerText`属性.所以`mycelldata`将使浏览器独立,单元格包含`string`数据类型.你不需要调用`toString()`. (2认同)