jqGrid: изменить цвет фона строки на основе значения ячейки строки по имени столбца - PullRequest
9 голосов
/ 04 июля 2011

jqGrid имеет столбец с именем Опубликовано. Его можно расположить в разных положениях, в зависимости от того, как сетка настроена клиентом, но всегда присутствует.

Мне нужно изменить цвет фона строк, если в столбце «Опубликовано» указано значение True

Я попробовал colmodel ниже, но предупреждение (rdata.Posted) всегда отображается неопределенно.

Как изменить цвет фона строки, если в столбце «Опубликовано» в этой строке указано значение true?

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

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

Обновление

В обновлении 2 Олег рекомендует использовать 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();
                    }
                }
            }
        }
    }

Ответы [ 2 ]

13 голосов
/ 05 июля 2011

Основные идеи по изменению цвета фона строки вы найдете здесь и здесь . Я рекомендую вам прочитать этот ответ , в котором обсуждались различные преимущества и недостатки различных подходов.

Чтобы получить индекс столбца из имени столбца, вы можете использовать следующую простую функцию:

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') вернет вам индекс в colModel столбца «MyColumnName».

Чтобы изменить цвет фона, вы можете следовать примеру

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

из ответа , но вместо ':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';
                }
            }
        }
    }
}

Соответствующая демонстрация здесь . Вы увидите следующее:

enter image description here

Кстати, если столбец «Закрыт» будет скрыт, все будет работать как прежде.

ОБНОВЛЕНО 2 : Ответ описывает, как использовать обратный вызов rowattr для упрощения решения и достижения наилучшей производительности (в случае gridview: true).

0 голосов
/ 04 июля 2011

Я думаю, что ответ прямо здесь: http://www.trirand.net/forum/default.aspx?g=posts&m=2678

Дайте мне знать, если вам нужен Ват.

С наилучшими пожеланиями.

Apolo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...