首页 文章

访问Vaadin 8 Grid单元格值

提问于
浏览
3

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

Vaadin 8 Grid的内容通过 Grid.setItems(Collection<T>) 设置 . 我找到了如何访问列 - Grid.getColumns() - 和数据提供程序 - Grid.getDataProvider() . 但我没有找到一种方法来组合它们并获得特定细胞的 Value ......

使用Vaadin 8 Grid时,有没有办法以类似的方式访问单元格值?

更新:

我目前试图找出通过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 */
        }
    }

1 回答

  • 0

    这取决于你将如何处理数据/单元格,但这是我的镜头:

    首先:Vaadin8 Grid 是一个 generic 类型,所以像 Grid<Entity> 一样,同样适用于 DataProvider<Entity> .

    使用数据提供者 . 从Grid grid.getDataProvider() 获取它,或者您可以直接访问它 .

    您可以通过应用 dataSource.fetch(new Query<>()) 获得 Stream<Entity> . 并使用流循环或查找或任何东西 .

    例如:

    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 时获取谓词来过滤entites,以便获取或使用流过滤器 streamEntities.filter(...)

    • 当你访问 Grid / DataProvider 是原始类型时,你需要一些铸造 (Entity) 并且仍然知道实体类型 .

    • 如果不熟悉 Stream a List 可能会更舒服 List<Entity> list = streamEntities.collect(Collectors.toList());

相关问题