JQGrid, change row background color based on condition

91,642

Solution 1

use formatter function :

like in this post

http://www.trirand.net/forum/default.aspx?g=posts&m=2678

Solution 2

Just for reference of others here is the completed code. I also found I needed to add another condition to change the color of the row. I needed to change the row color only when the paid field is true, and when the status is complete. This code shows that. It also fixed the problem of losing the formatting when the grid is reloaded when sorting the columns. I hope this helps someone else.

    var rowsToColor = [];
    jQuery(function () {
        $("#shippingscheduletable").jqGrid({
            url: $("#shippingscheduleurl").attr('href'),
            datatype: 'json',
            mtype: 'GET',
            altRows: true,
            colNames: ['Dealer', 'Model', 'Invoice', 'Date', 'PO', 'Serial', 'Status', 'City', 'State', 'Paid', 'Promo', 'Carrier', 'Int Notes', 'Ord Notes', 'Terms'],
            colModel: [
     { name: 'Company', index: 'id', width: 125, align: 'left' },
     { name: 'Model', index: 'Model', width: 50, align: 'left' },
     { name: 'Invoice', index: 'Invoice', width: 50, align: 'left' },
     { name: 'Date', index: 'OrderDate', width: 60, align: 'left' },
     { name: 'Po', index: 'PONum', width: 75, align: 'left' },
     { name: 'Serial', index: 'Serial', width: 50, align: 'left' },
     { name: 'Status', index: 'OrderStatus', width: 70, align: 'left' },
     { name: 'City', index: 'City', width: 100, align: 'left' },
     { name: 'State', index: 'State', width: 30, align: 'left' },
     { name: 'Paid', index: 'IsPaid', width: 30, align: 'left', formatter: rowColorFormatter },
     { name: 'Promo', index: 'Promo', width: 50, align: 'left' },
     { name: 'Carrier', index: 'Carrier', width: 80, align: 'left' },
     { name: 'InternalNotes', index: 'InternalNotes', width: 110, align: 'left' },
     { name: 'OrderNotes', index: 'OrderNotes', width: 110, align: 'left' },
     { name: 'Terms', index: 'Terms', width: 60, align: 'left' }
     ],
            pager: jQuery("#shippingschedulepager"),
            rowNum: 100,
            rowList: [100, 150, 200],
            sortname: 'Company',
            sortorder: "asc",
            viewrecords: true,
            height: '700px',
            multiselect: true,
            gridComplete: function () {
                for (var i = 0; i < rowsToColor.length; i++) {
                    var status = $("#" + rowsToColor[i]).find("td").eq(7).html();
                    if (status == "Complete") {
                        $("#" + rowsToColor[i]).find("td").css("background-color", "green");
                        $("#" + rowsToColor[i]).find("td").css("color", "silver");
                    }
                }
             }
        });
    });

    function rowColorFormatter(cellValue, options, rowObject) {
        if (cellValue == "True")
            rowsToColor[rowsToColor.length] = options.rowId;
        return cellValue;
    }

so the formatter function adds the rowid that needs to be changed to an array if the paid value is true, then when the grid is complete it changes the css for each row id, after it checks the value of the 7th td which is where my status is found to make sure it is complete.

Solution 3

I tried this and works to set the background color for the entire row. Works with paging also:

gridComplete: function()
{
    var rows = $("#"+mygrid).getDataIDs(); 
    for (var i = 0; i < rows.length; i++)
    {
        var status = $("#"+mygrid).getCell(rows[i],"status");
        if(status == "Completed")
        {
            $("#"+mygrid).jqGrid('setRowData',rows[i],false, {  color:'white',weightfont:'bold',background:'blue'});            
        }
    }
}

Solution 4

This pointed me in the right direction but didnt quite work for me with paging. If it helps anyone, the following did work and doesn't use the colModel formatter.

I needed to apply a red colour to individual cells with outstanding amounts (name:os) in the 9th td on my grid. Datatype was json and I used the loadComplete function which has the data response as its parameter:

loadComplete: function(data) {
    $.each(data.rows,function(i,item){
        if(data.rows[i].os>0){
            $("#" + data.rows[i].id).find("td").eq(9).css("color", "red");
        }
    });
},

Got rid of the paging issues I had and works on sorting etc..

As an aside - I've found the loadComplete function useful for adding in dynamic information like changing the caption texts for search results - probably obvious to many but I'm new to json, jquery and jqgrid

Solution 5

What about via Jquery Css.
See code below to set rows with Inactive status to red. Grid name is jqTable.

setGridColors: function() {
    $('td[title="Inactive"]', '#jqTable').each(function(i) {
        $(this).parent().css('background', 'red');
    });
}
Share:
91,642
twal
Author by

twal

C# .net programmer

Updated on May 09, 2020

Comments

  • twal
    twal almost 4 years

    I have the following jqgrid that uses the jquery ui theme imported to my master page.

      $("#shippingscheduletable").jqGrid({
                url: $("#shippingscheduleurl").attr('href'),
                datatype: 'json',
                mtype: 'GET',
                altRows: true,
                colNames: ['Dealer', 'Model', 'Invoice', 'Date', 'PO', 'Serial', 'Status', 'City', 'State', 'IsPaid', 'Promo', 'Carrier', 'Int Notes', 'Ord Notes', 'Terms'],
                colModel: [
         { name: 'Company', index: 'id', width: 125, align: 'left' },
         { name: 'Model', index: 'Model', width: 50, align: 'left' },
         { name: 'Invoice', index: 'Invoice', width: 50, align: 'left' },
         { name: 'Date', index: 'OrderDate', width: 60, align: 'left' },
         { name: 'Po', index: 'PONum', width: 75, align: 'left' },
         { name: 'Serial', index: 'Serial', width: 50, align: 'left' },
         { name: 'Status', index: 'OrderStatus', width: 70, align: 'left' },
         { name: 'City', index: 'City', width: 100, align: 'left' },
         { name: 'State', index: 'State', width: 30, align: 'left' },
         { name: 'IsPaid', index: 'IsPaid', width: 30, align: 'left' },
         { name: 'Promo', index: 'Promo', width: 50, align: 'left' },
         { name: 'Carrier', index: 'Carrier', width: 80, align: 'left' },
         { name: 'InternalNotes', index: 'InternalNotes', width: 110, align: 'left' },
         { name: 'OrderNotes', index: 'OrderNotes', width: 110, align: 'left' },
         { name: 'Terms', index: 'Terms', width: 60, align: 'left' }
         ],
                pager: jQuery("#shippingschedulepager"),
                rowNum: 100,
                rowList: [100, 150, 200],
                sortname: 'Company',
                sortorder: "asc",
                viewrecords: true,
                height: '700px',
                multiselect: true
            });
    

    I would like to change the row color for all rows that have a true value for the IsPaid Field. Is this possible? if so, how would I do this? I have been researching custom formatting, but I am unsure if this is the correct approach, as I cannot find anything about changing the color of the back ground.