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

如何点击瓦丁8网格中网格单元格中的组件来选择单元格行?

荆城
2023-03-14

单击包含< code>VerticalLayout行等组件的Vaadin 8 网格中的单元格时,不会选中该行(使用Vaadin 8.1.5)。

如果组件未填充整个单元格,则单击单元格中未使用的区域会使该行处于选中状态。

我一直在研究如何将点击组件转发到单元格点击侦听器,但尚未对此有任何控制。猜猜这甚至不是最好的方法。

解决方案是什么?

共有2个答案

薄欣怿
2023-03-14

请参阅以下问题 https://github.com/vaadin/framework/issues/10425。正如 tsuoanttila 所说,解决方案是调用列.setWidget事件允许(true); 所以你不需要抽象布局包装器,也不需要布局点击列表器。

柯轶
2023-03-14

我提供了我自己的当前解决方案,作为不弄乱问题的答案和单独的可能评论。这个特定的解决方案并不完美——例如多选处理不正确——但它只是为了给出我决定如何处理这个问题的想法。

我们的想法是扩展一个值提供者,使它拥有一个对网格的引用,它为网格生成值。前面提到过——除了生成网格列组件之外——在组件中添加了click listener。

在这个包中,单击一个组件,有对网格和行项目的引用,所以选择/取消选择非常容易。

@RequiredArgsConstructor // i like lombok
private static class GridCallbackValueProvider
         implements ValueProvider<GridEntity, Layout> {

   private final Grid<GridEntity> grid;

   @Override
   public Layout apply(GridEntity source) {
      AbsoluteLayout al = new AbsoluteLayout();
      al.setWidth("100px");
      al.setHeight("30px");
      al.addStyleName(((source.isValid()) ? "green" : "red" ));
      al.addLayoutClickListener( clickEvent -> {
         if(grid.getSelectedItems().contains(source))
            grid.deselect(source);
         else
            grid.select(source);                
      });
      return al;
    }

}

如果有人感兴趣:在这个测试代码中GridEntity。isValid()只返回随机布尔值,用于从以下样式中进行选择:

.green { background-color: green; }
.red { background-color: red; }

添加到网格中就像这样:

grid.addComponentColumn(new GridCallbackValueProvider(grid) )
        .setCaption("status").setId("status").setWidth(140);
 类似资料:
  • 我想删除Vaadin 8网格中所有单元格周围的边框。我不相信这可以用代码来做,并且表格的css不适用于网格,因此你如何为网格执行此操作?

  • 我有以下代码,成功地将单元格的内容集中在我的Vaadin网格中。 它让它看起来像这样。 如何实现垂直居中?当我尝试添加样式名称 v-对齐中间时,它什么也没做。

  • Vaadin 7中的和组件之间有什么区别? 我应该使用哪种,何时使用?

  • 我正在从Vaadin 7 Table迁移到Vaadin 8 Grid。在Vaadin 7 Table中,我们使用了IndexedContainer或Container with Property,并且可以使用或访问表单元格值。 瓦丁 8 网格的内容通过

  • 我想用复选框显示所有行,所有列,因为我只想要true/false值。但是我想访问单个单元格值,即每个复选框都可以选中/不选中。见下图。 根据我的知识,当我勾选复选框时,行的所有复选框都将被选中。那么,我可以选中/取消选中单个框吗?

  • 我正在使用顺风CSS,并试图建立一个网格,使某些单元格内容跨越多个单元格,而其他项目留在单个单元格。在下面的代码中,我试图展示我正在尝试完成的事情。我知道我的col-span-2班什么也没做,但我把它放在那里是为了表明我希望我能做什么。我想让所有的单元格都是相同的宽度(我只想让一些单元格内容跨越分隔线)。我需要某种覆盖逻辑吗? 感谢任何帮助。 谢谢!