【问题标题】:jqGrid: change background color of row based on row cell value by column namejqGrid:根据列名的行单元格值更改行的背景颜色
【发布时间】:2011-09-28 08:18:07
【问题描述】:

jqGrid 有一个名为 Posted 的列。它可以根据客户的网格配置方式定位在不同的位置,但始终存在。

如果 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}],
...

更新

在 update2 中,Oleg 建议使用 rowattr。我还需要在操作列中隐藏内联删除按钮和自定义发布按钮。我在 loadComplete 中使用下面的代码。如何使用 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();
                    }
                }
            }
        }
    }

【问题讨论】:

    标签: javascript jqgrid


    【解决方案1】:

    更改行背景颜色的主要思路是herehere。我建议您阅读this answer,其中讨论了不同方法的不同优缺点。

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

    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;
        };
    

    函数getColumnIndexByName($("#list"), 'MyColumnName') 将为您获取“MyColumnName”列的colModel 中的索引。

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

    loadComplete: function() {
        $("tr.jqgrow:odd").addClass('myAltRowClass');
    }
    

    来自the answer,但您可以使用jQuery.filter 自己编写过滤器,而不是':odd' 过滤器。在过滤器内部,您可以使用:nth-child() 访问来自相应&lt;td&gt; 元素的数据(请参阅here

    更新:您可以执行以下操作(非常接近来自the another answer 的代码):

    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';
                    }
                }
            }
        }
    }
    

    对应的demo是here。您将看到以下内容:

    顺便说一句,如果“已关闭”列被隐藏,一切都会像以前一样继续工作。

    更新 2The answer 描述如何使用rowattr 回调来简化解决方案并获得最佳性能(在gridview: true 的情况下)。

    【讨论】:

    • 谢谢。 Colmodel 定义为{formatter:"checkbox",label:null,name:"Posted",editable:true,classes:null,hidden:true}。我尝试使用$("tbody &gt; tr.jqgrow &gt; td:nth-child("+(i+1)+")", grid[0]) 获取价值,但这会返回奇怪的数组。如何获取发布的列值?
    • @Andrus:我为您制作了满足您需要的演示。请参阅我的答案的更新部分。
    • @Andrus:抱歉,posted =row.cells[postedDateCol].textContent.toString().trim() != "" 的声明是用什么语言写的?我建议你使用 var mycell=row.cells[postedDateCol], mycelldata = mycell.textContent || mycell.innerText; if (mycelldata === "") {/*do something in case of empty data*/} 的东西。 mycell 将是 &lt;td&gt; 的 DOM 元素。某些 Web 浏览器仅支持 textContent 属性。其他浏览器仅支持 innerText 属性。所以mycelldata 将获得独立于浏览器的单元格包含为string 数据类型。您无需致电toString()
    • @Andrus:如果您需要修剪单元格中的文本,您可以使用不同的方法,但 trim 方法不存在(或者至少在 JavaScript 的所有实现中都不存在)。它存在于 JavaScript 1.8.1(Firefox 3.5 及更高版本)和 ECMAScript 5 标准中,但并非无处不在。您可以使用replace 方法,定义像here 描述的修剪方法或使用更复杂的版本(例如参见herehere
    • @Andrus:你定义myAltRowClass在哪里可能很重要。查看答案中描述的the demo,并在您的项目中执行相同操作。
    【解决方案2】:

    我想答案就在这里:http://www.trirand.net/forum/default.aspx?g=posts&m=2678

    如果您需要,请告诉我。

    最好的问候。

    阿波罗

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-04-23
      • 2020-06-02
      • 1970-01-01
      • 2014-09-10
      • 1970-01-01
      相关资源
      最近更新 更多