当前位置: 首页 > 知识库问答 >
问题:

基于内容的Vaadin 10网格样式单独行

淳于博文
2023-03-14

我正在使用一个Vaadin网格来显示传入的信息并实时更新它。我已经能够通过访问DOM来设置所有行的样式,如下所示:

<dom-module id="my-grid" theme-for="vaadin-grid">
    <template>

        <style>
            [part="row"] {
                height: 27px;
                font-size: 14px;
                max-height: 27px;
            }

        </style>
    </template>
</dom-module>

我试图做的是根据行的数据内容为某些行设置特定的样式。基本上我有一列布尔值,如果是真的,我希望该行有绿色背景,如果是假的,我希望该行有红色背景。现在确定如何在Java代码或shared-styles.html中实现这一点。太感谢你们了!

我已经看到了这个示例,该示例基于一个条件来编程样式化一个列,而不是一个行。

Grid<Person> grid = new Grid<>();
grid.setItems(people);

grid.addColumn(new ComponentRenderer<>(person -> {
    if (person.getGender() == Gender.MALE) {
        return new Icon(VaadinIcons.MALE);
    } else {
        return new Icon(VaadinIcons.FEMALE);
    }
})).setHeader("Gender");

共有1个答案

梁渊
2023-03-14

到目前为止(Vaadin10、Vaadin-Grid5),还没有API可以将自定义属性/类添加到网格中的各个行中。在您的应用程序代码中实现这个用例是可能的,但是实现可能不是很有效。

一种方法是为网格的每一列定义一个自定义呈现器,将每个单元格内容包装在一个额外的div中,并将类/属性添加到包装器中。您可以使用TemplateRenderer将这些包装器对内存/性能的影响降至最低:

Grid<Person> grid = new Grid<>();
grid.setDataProvider(...);

ValueProvider<Person, String> cssClassProvider = (person) -> {
    String cssClass = "my-grid-cell";
    if (person.getAge() <= 16) {
        cssClass += " junior";
    } else if (person.getAge() >= 60) {
        cssClass += " senior";
    }
    return cssClass;
};

grid.addColumn(TemplateRenderer.<Person>
        of("<div class$=\"[[item.class]]\">[[item.age]]</div>")
            .withProperty("class", cssClassProvider)
            .withProperty("age", Person::getAge));
grid.addColumn(TemplateRenderer.<Person>
        of("<div class$=\"[[item.class]]\">[[item.name]]</div>")
            .withProperty("class", cssClassProvider)
            .withProperty("name", Person::getName));

然后可以根据CSS类(在shared-styles.html中)设置网格单元格的背景:

<custom-style>
  <style>
    .my-grid-cell.junior {
      background-color: coral;
    }

    .my-grid-cell.senior {
      background-color: darkmagenta;
    }
  </style>
</custom-style>
<dom-module id="my-grid-theme" theme-for="vaadin-grid">
  <template>
    <style>
      [part~="cell"] {
        min-height: 0;
      }

      [part~="cell"] ::slotted(vaadin-grid-cell-content) {
        padding: 0;
      }
    </style>
  </template>
</dom-module>

<custom-style>
  <style>  
    .my-grid-cell {
      min-height: calc(var(--lumo-size-m) - 2 * var(--lumo-space-xs));
      padding: var(--lumo-space-xs) var(--lumo-space-m);
    }
  </style>
</custom-style>
 类似资料:
  • 我得到了一个两列五行的CSS网格(在768px以上的显示器上)。所有行都被设置为“min-content”,最后一行被设置为“auto”。 我定义了模板网格区域,每个“单元格”一个,但第二列的第3到第5行除外--名为a6(在示例代码中) 当a6中很少或没有内容时,网格的行为完全符合我的要求。然而,如果在a6中添加了更多的内容,则a5和a7区域的高度会扩大,尽管它们的内容没有改变。 CSS: HTM

  • 我有用自定义单元格(继承自)填充的用户界面视图,每个单元格都包含一个,该视图根据其内容自动调整大小。事情是这样的,如何根据内容(可变视图)更改 单元格的高度。 该解决方案必须是动态的,因为用于填充< code>UIWebViews的HTML是从不断变化的提要中解析的。 我觉得我需要使用委托方法 中更改单元格的高度吗? 任何帮助都是伟大的。谢谢 两年多前我问过这个问题。通过介绍自动布局,可以找到iO

  • 问题内容: 我正在尝试在最顶部创建的CSS网格上放置一个嵌套()。还没有爱(它不起作用)。也许这是不可能的,或者我缺少了什么? 问题答案: 一个范围 格格式化的内容被限制为父子关系。 这意味着网格容器始终是父级,而网格项目始终是子级。网格属性仅在此关系内起作用。 子代以外的网格容器的后代不属于网格布局,并且不接受网格属性。 您正在尝试将网格属性应用于属于网格容器的子元素而不是子元素的元素。这些元素

  • 谷歌电子表格中有一个项目列表,我们需要链接谷歌硬盘上另一个文件夹中的一组文件。链接的功能如下所示: 我们遇到的问题是,如果文件夹的内容与列表的顺序不完全匹配,则文件到行项目的顺序将不同步。如果同一行中另一个单元格的内容与文件名中的内容匹配,我们希望某些文件超链接到工作表中的某些单元格。我们希望避免为每个行项目手动创建链接。这在谷歌表单中是可能的吗?

  • 问题内容: 我有以下风格: 它来自主题的CSS样式文件。但是我想用这种风格覆盖它: 但这没有效果,我的组件使用第一种样式。如何覆盖第一个样式1?我尝试过,但它什么也没做。 我应该在css文件的开头定义自定义样式吗? 更新: 我发现我可以使用函数gridOptions.getRowClass设置要使用的样式类。但是我想解决中心问题(对于我在应用程序中使用的所有角度网格)。任何的想法? 问题答案: 你

  • 在Jquery Mobilede页面的内容是完全开放的,但是Jquery Mobile框架提供了一些有用的工具及组件,比如可折叠的面板,多列网格布局等?方便地为移动设备格式化你的内容