通过 ClientTemplate 在 Kendo 网格中设置单元格样式

Posted

技术标签:

【中文标题】通过 ClientTemplate 在 Kendo 网格中设置单元格样式【英文标题】:Styling cell in Kendo grid via ClientTemplate 【发布时间】:2015-01-14 08:08:28 【问题描述】:

我正在尝试在剑道 (mvc) 网格中设置“包含”单元格的样式。列绑定如下:

@(html.Kendo().Grid(Of RTFVM)().Name("RealTimeFinancials") _
 .Columns(Sub(c)
                  c.Bound(Function(x) x.Line.Months(0).Total).Title("Jan").ClientTemplate("#= processCell(Line.Months[0])#")
etc

而我的JS条件样式函数如下:

 function processCell(CellData) 
    var monthNumber = CellData.MonthNumber;
    var output;

    switch(CellData.Message) 
        case null: output = fn(CellData.Total); break;
        case 'Total': output = '<div style="background-color: Red;"><strong>' + fn(CellData.Total) + '</strong></div>';
            break;
        default: output = '<small>' + CellData.Message + '</small>';
    

    return output;

使用上面的方法,我可以设置出现在单元格中的 text 样式,但显然不是单元格本身(我猜你可以将其称为文本对象的“父级”/容器)。

有什么方法可以从 ClientTemplate 中访问/设置单元格样式,还是我必须使用 data-uid row/column-find 方法使用数据绑定事件单独查找单元格?

【问题讨论】:

【参考方案1】:

试试看:

将类/id 添加到从“processCell”函数返回的输出“div”中,并使用该类获取单元格的父元素并向该单元格添加样式。 希望它有效!

【讨论】:

感谢您并为您的迟到表示歉意:我不确定我可以使用什么对象来获取单元格的父元素。我在 processCell 范围内的所有内容都是数据项本身,我看不到如何通过 ClientTemplate 从网格级上下文中注入适当的对象......或者你是说使用纯 CSS 导航回 DOM ? 试一试:col.Bound(e => e.Name).ClientTemplate("#= Name # ") 并在 dataBound 事件上调用一个 javascript 函数,该函数将使用 id 即“xyz”获取单元格元素,并使用 .parent() 函数获取网格的行元素并为其设置样式。 好的,谢谢 - 你把我引向 Daniel 的解决方案(见上文),我认为它确实回答了这个问题,即使它似乎对所有样式都无效。 很高兴您得到了一些答案。我也会尝试您提供的解决方案,如果可能的话,我会提出一些更好的解决方案。:) 我已经针对这个问题打开了一个单独的问题:***.com/questions/26992745/… 【参考方案2】:

经过大量研究和 Satya 的帮助,我发现了一个基于 Daniel 的回答 here 的广泛通用解决方案 - 尽管它似乎只是部分工作:

我创建了一个函数,它尝试根据 grid.databound 事件触发的数据源上的字段值来设置行的样式:

function LineItems_Databound() 
    var grid = $("#RealTimeFinancials").data("kendoGrid");
    var data = grid.dataSource.data();
    $.each(data, function (i, row) 
        var LineItem = row.Message;

        switch(LineItem) 
            case 'Total': $('tr[data-uid="' + row.uid + '"]').addClass('customClass'); break;        
        
    );

customClass 是:

.customClass 
        border-top-style:double;
        border-style:double;
        border-top-width:thick;
        background-color:lightyellow;
    `

我遇到的问题(在简单地在网格上设置 .css 时也会发生)是,虽然行的背景颜色发生了变化,但网格边框却没有。我似乎根本无法设置单元格/行边框的样式。

我认为它确实回答了我的广泛问题,尽管在这种情况下仍然存在问题。

我已经打开了一个单独的问题来解决明显的 css 类问题here

【讨论】:

为了完整性(并反馈在我的另一个问题中学到的内容),上述不适用于边框的原因是 tr 元素不采用边框格式,而 td 元素(单元格)可以.为了上述工作,有必要遍历 tr 中的 td 并按照描述应用类:***.com/questions/26992745/…

以上是关于通过 ClientTemplate 在 Kendo 网格中设置单元格样式的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Kendo 网格中的 ClientTemplate 调用 javascript 方法?

如何从 Kendo.Grid 的 ClientTemplate 内部向 JavaScript 函数发送参数?

在剑道网格 ASP.NET MVC ClientTemplate 中转义 +(加号)符号

Kendo UI Grid - 客户端模板:转义 # 符号

带有条件的 Kendo Grid 客户端模板

MVC Kendo Grid 未显示任何数据