java - 访问 Vaadin 8 网格单元格值

标签 java vaadin8 vaadin-grid

我正在从 Vaadin 7 Table 迁移到 Vaadin 8 Grid。在 Vaadin 7 表中,我们使用 IndexedContainer 或具有 Property 的 Container,并且可以使用 IndexedContainer.getItem(propertyId).getItemProperty(itemId).getValue(); 访问表单元格值。或Container.getContainerProperty(itemId, propertyId).getValue() .

Vaadin 8 Grid 的内容通过 Grid.setItems(Collection<T>) 设置。我找到了如何访问列 - Grid.getColumns() - 和数据提供者 - Grid.getDataProvider() 。但我没有找到一种方法将它们组合起来并获取特定单元格的值...

使用 Vaadin 8 Grid 时是否可以以类似的方式访问单元格值?

更新:

我目前正在尝试找出通过网格方法访问数据的方法。目前,我有 Vaadin 7 表代码,我们可以在其中以通用方式访问单元格值,以将数据导出到例如Excel、CSV 或 PDF:


    Table table = ...; /* Is passed in while initializing and is used as kind of black box in the exporter */ 

    // Compiling cell values
    Object[] visibleColumns = table.getVisibleColumns();
    Container container = table.getContainerDataSource();
    for (Object itemId : container.getItemIds())
    {
        for (Object propertyId : visibleColumns)
        {
            Property property = container.getContainerProperty(itemId, propertyId);
            Object value = property == null ? null : property.getValue();
            buildCell(value);
        }
    }

在 Vaadin 8 中,我有网格并且我尝试去适应:


    Grid grid = ...; // Passed in while initializing

    // Compiling cell values
    List visibleColumns = new ArrayList();
    List columns = table.getColumns();
    for(Iterator iterator = columns.iterator(); iterator.hasNext();)
    {
        Column column = iterator.next();
        if (!column.isHidden())
        {
            visibleColumns.add(column);
        }
    }

    // The Grid gets a Collection set as items, so I assume the rows should be ListDataProvider
    ListDataProvider listContainer = (ListDataProvider)grid.getDataProvider();
    Collection items = listContainer.getItems();
    for (/* Now I should be able to get the stored values in each row, but I assume I need the data types ... */)
    {
        for (Column column : visibleColumns)
        {
            String propertyId = column.getId(); // Could be null if no ID is given
            /* At least here I'd like to have access to the cell value */
        }
    }

最佳答案

这很大程度上取决于您要如何处理数据/单元格,但这是我的镜头:

首先:Vaadin8 Gridgeneric输入类似 Grid<Entity>同样适用于DataProvider<Entity> .

使用数据提供程序。从网格获取 grid.getDataProvider()或者也许您已经可以直接访问它。

您可以拥有Stream<Entity>通过申请dataSource.fetch(new Query<>()) 。并使用流来循环或查找或执行任何操作。

例如:

Stream<Entity> streamEntities = g.getDataProvider().fetch(new Query<>());
streamEntities.forEach( entity -> {
   entity.getStuff();   // THE POINT IS HERE
                        // no cell value but entitys field by getter
   addAsCsvRow(entity); // example of some method you might implement
                        // to process outside lambda
});

注意

  • 您可以通过在构造 Query 时添加谓词来过滤实体用于获取或使用流过滤器 streamEntities.filter(...)
  • 你需要一些选角 (Entity)并且仍然了解实体类型 if Grid/DataProvider当您访问它时它是原始类型。
  • 如果不熟悉Stream一个List可能会更舒服List<Entity> list = streamEntities.collect(Collectors.toList());

关于java - 访问 Vaadin 8 网格单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46906602/

相关文章:

tomcat - 无法在 Java9 项目中处理文件 module-info.class 导致 ClassFormatException

java - Vaadin 8. 资源无法解析

Vaadin 14 Grid - 如何迭代网格行中的所有按钮

java - 查看端口问题中的元素[特殊]

java - 为什么我不能在类之外的方法中使用数组?

java - 如何在 Vaadin 8 中设置 DateField 以根据用户的时区突出显示默认日期

java - Vaadin Push 在 10 中不起作用(流程)

containers - 我可以在 Vaadin 8 中创建没有 bean 类的网格吗?

java - 当我在 Mac OX 10.10 上使用 IntelliJ IDEA 14 构建 scala 项目时出现问题

java - 改造-IllegalArgumentException : unexpected url