Как изменить цвет фона пользовательского интерфейса Kendo для ячейки сетки MVC

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

 @(Html.Kendo().Grid(Model)
        .Name("LineItems")
        .Events(e=> e
            .DataBound("LineItems_Databound")
        )
        .Columns(columns =>
            {
                columns.Bound(o => o.Ui).Title("UI").Width(20);
                columns.Bound(o => o.QtyOrdered).Title("Qty Ord").Width(30);
                columns.Bound(o => o.Nomenclature).Width(200);
                columns.Bound(o => o.QtyShipped).Width(20).Title("Qty Sent");
                columns.Bound(o => o.QtyReceived).Width(20).Title("Qty Rx");
                columns.Bound(o => o.ReqID).Width(50);
                columns.Bound(o => o.JCN_Job).Width(50).Title("Job/JCN");
                columns.Bound(o => o.ManPartID).Width(100).Title("Part#");
                columns.Bound(o => o.Requestor).Width(100).Title("Requestor");
            })
                     .ToolBar(toolbar =>
                     {
                         //toolbar.Create();
                         toolbar.Save();
                     })


                .Editable(editable => editable.Mode(GridEditMode.InCell))
                .Sortable()
                .Selectable()
                .Resizable(resize => resize.Columns(true))
                .Reorderable(reorder => reorder.Columns(true))
                .DataSource(dataSource => dataSource
                    .Ajax()
                    .Model(model => model.Id(p => p.ID))
                    .Batch(true)
                    .ServerOperation(false)
                    .Read(read => read.Action("Editing_Read", "Shipping"))
                    .Update(update => update.Action("UpdateShipment", "Shipping"))
                    //.Destroy(update => update.Action("Editing_Destroy", "Shipping"))
                )
)

В моем скрипте есть код, который зацикливается на моей сетке на .databound.

 function LineItems_Databound() {
      var grid = $("#LineItems").data("kendoGrid");
      var data = grid.dataSource.data();
      $.each(data, function (i, row) {
          var qtyRx = row.QtyReceived;
          var qtySx = row.QtyShipped;


          if (qtyRx < qtySx) {
             // Change the background color of QtyReceived here
          }



      });
   }

person Alan Fisher    schedule 29.06.2012    source источник


Ответы (2)


С привязкой Ajax

Используя jquery, вы можете выбрать и изменить цвет фона ячейки сетки, используя uid (уникальный идентификатор) строки и выбрав n-й дочерний элемент этой строки.

function LineItems_Databound() {
    var grid = $("#LineItems").data("kendoGrid");
    var data = grid.dataSource.data();
    $.each(data, function (i, row) {
      var qtyRx = row.QtyReceived;
      var qtySx = row.QtyShipped;

      if (qtyRx < qtySx) {
        //Change the background color of QtyReceived here
        $('tr[data-uid="' + row.uid + '"] td:nth-child(5)').css("background-color", "red");
      }
    });
}

Обновить

Алан Фишер в комментариях предложил другой способ решения этой проблемы, который он узнал от людей из KendoUI. Столбец QtyReceived использует ClientTemplate, который передает параметры событию с привязкой к данным.

@(Html.Kendo().Grid(Model)
  .Name("LineItems")
  .Events(e => e.DataBound("LineItems_Databound"))
  .Columns(columns =>
  {
    columns.Bound(o => o.Ui).Title("UI").Width(20);
    columns.Bound(o => o.QtyOrdered).Title("Qty Ord").Width(30);
    columns.Bound(o => o.Nomenclature).Width(200);
    columns.Bound(o => o.Requestor).Width(100);
    columns.Bound(o => o.QtyShipped).Width(20).Title("Qty Sent");
    columns.Bound(o => o.QtyReceived).Width(20).Title("Qty Rx")
      .ClientTemplate("#= LineItems_Databound(QtyShipped,QtyReceived)#");
    columns.Bound(o => o.ReqID).Width(50);
    columns.Bound(o => o.JCN_Job).Width(50).Title("Job/JCN");
    columns.Bound(o => o.ManPartID).Width(100).Title("Part#");
    columns.Bound(o => o.ReceivedBy).Width(100).Title("Received By");
    columns.Bound(o => o.RecAtSiteDate).Width(100).Title("Received Date")
      .Format("{0:dd MMM, yy}");
  })
)

<script>
  function LineItems_Databound(qtySx, qtyRx) {
      if (qtyRx < qtySx) {
        return "<div style='background: pink'>" + qtyRx + " </div>";
      }
      else {
       return qtyRx;
      }
  }
</script>

С привязкой к серверу

Если вы используете привязку данных сервера, а не привязку данных ajax, CellAction может быть лучшим способом сделать это.

@(Html.Kendo().Grid(Model)
    .Name("LineItems")
    .CellAction(cell =>
    {
      if (cell.Column.Title.Equals("QtyReceived"))
      {
        if (cell.DataItem.QtyReceived.Value < cell.DataItem.QtyShipped.Value)
        {
          cell.HtmlAttributes["style"] = "background-color: red";
        }
      }
    })
    .Columns(columns =>
    {
        columns.Bound(o => o.Ui).Title("UI").Width(20);
        columns.Bound(o => o.QtyOrdered).Title("Qty Ord").Width(30);
        columns.Bound(o => o.Nomenclature).Width(200);
        columns.Bound(o => o.QtyShipped).Width(20).Title("Qty Sent");
        columns.Bound(o => o.QtyReceived).Width(20).Title("Qty Rx");
        columns.Bound(o => o.ReqID).Width(50);
        columns.Bound(o => o.JCN_Job).Width(50).Title("Job/JCN");
        columns.Bound(o => o.ManPartID).Width(100).Title("Part#");
        columns.Bound(o => o.Requestor).Width(100).Title("Requestor");
    })
)
person Daniel    schedule 30.06.2012
comment
Я попробовал ваше решение, но сетка в этот момент не привязана, и у меня нет данных для сравнения. - person Alan Fisher; 02.07.2012
comment
Я не смотрел достаточно внимательно, чтобы увидеть, что вы используете привязку ajax. Это работает только с привязкой к серверу. - person Daniel; 02.07.2012
comment
Я обновил свой ответ, добавив способ, который работает для привязки данных ajax. - person Daniel; 02.07.2012
comment
@AlanFisher Я только что узнал, что есть более простой способ изменить цвет фона, используя row.style.backgroundColor. Я обновил ответ, чтобы включить это. - person Daniel; 04.07.2012
comment
Я пробовал, но получаю, что row.style не определен. Вы действительно заставили это работать? я - person Alan Fisher; 05.07.2012
comment
Я тестировал это раньше и думал, что это работает, но оказалось, что я смотрел не на ту сетку в своем проекте. Теперь, когда я пытаюсь сделать это снова, я также получаю undefined для row.style. Извините за путаницу. Я думаю, мы пока должны придерживаться решения jquery. - person Daniel; 05.07.2012
comment
спасибо за ответ, на самом деле я получил еще одно решение от Kendo, которое работает, если вы заинтересованы. ‹script src='pastie.org/4210869.js'›‹/script - person Alan Fisher; 06.07.2012
comment
Не обращайте внимания на последний комментарий, я пытался редактировать, но это заняло слишком много времени. Вот реальная ссылка на код: pastie.org/4210869 Обратите внимание на ClientTemplate, прикрепленный к строке QtyReceived. Я не уверен, что мне нравится это конкретное решение, так как оно, кажется, захватывает событие DataBound, добавляя параметры, но оно работает. pastie.org/4210869 - person Alan Fisher; 06.07.2012
comment
Это интересно. Мне бы и в голову не пришло так поступить. Хорошо иметь более одного способа сделать это. Я добавлю ваше решение к ответу, так что если кому-то это понадобится, у них будут варианты. - person Daniel; 06.07.2012
comment
как получить заголовок td $('tr[data-uid=' + row.uid + '] td:nth-child(5)').css(background-color, red); с этим, если столбец переупорядочен, он не будет работать - person GANI; 25.07.2014
comment
Если это не работает для вас, попробуйте альтернативное решение, описанное в разделе «Обновление». - person Daniel; 25.07.2014

Если вы заполняете сетку из модели представления MVC, вот простой способ сделать это. Создайте стили CSS:

   <style>
        .TrunkSummaryLightYellow {
            background: LightYellow;
        }

        .TrunkSummaryPink {
            background: Pink;
        }

        .TrunkSummaryLightGreen {
            background: LightGreen;
        }
    </style>

Затем используйте готовую к документу функцию следующим образом:

$(document).ready(function () {
    var grid = $("#TrunkSummaryGrid").data("kendoGrid");
    var gridData = grid.dataSource.view();

    for (var i = 0; i < gridData.length; i++) {
        if (gridData[i].SomeProperty == SomeValue) {
            grid.table.find("tr[data-uid='" + gridData[i].uid + "']").addClass("TrunkSummaryLightYellow");
        }
    }
})

Спасибо Дейву Глику (ссылка) за это предложение.

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

grid.table.find("tr[data-uid='" + gridData[i].uid + "']")[0].cells[4].style.backgroundColor = 'pink';

person Graham Laight    schedule 24.04.2017