【问题标题】:Accessing Vaadin 8 Grid cell value访问 Vaadin 8 Grid 单元格值
【发布时间】:2018-04-05 00:27:58
【问题描述】:

我正在从 Vaadin 7 Table 迁移到 Vaadin 8 Grid。在 Vaadin 7 Table 中,我们使用了 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()。但是我没有找到一种方法来组合它们并获取特定单元格的值...

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

更新:

我目前正在尝试找出通过 Grid 方法访问数据的方法。目前我有 Vaadin 7 Table 代码,我们在其中以通用方式访问单元格值以将数据导出到例如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 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 */
        }
    }

【问题讨论】:

  • 这个单元格值是做什么用的?
  • 提供一些代码,您只能通过Grid 方法访问和使用这些数据。一些 onSelected- / onClickListener?
  • 网格值用于以 XLS、CSV 或 PDF 格式导出。除此之外,请在下面查看我的最终解决方案。

标签: java vaadin8 vaadin-grid


【解决方案1】:

这很大程度上取决于您要对数据/单元格做什么,但这是我的镜头:

首先: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 以获取或使用流过滤器streamEntities.filter(...) 时添加谓词来过滤实体
  • 如果Grid / DataProvider 在您访问它时是原始类型,则您需要对(Entity) 进行一些转换并且仍然了解实体类型。
  • 如果不熟悉Stream 一个List 可能会更舒服List<Entity> list = streamEntities.collect(Collectors.toList());

【讨论】:

    【解决方案2】:

    首先,我会回答问题,然后展示我的解决方案。

    @rmuller 网格值用于以 XLS、CSV 或 PDF 格式导出。

    由于导出需要处理网格中使用的每种类型的数据,因此整个实现需要是通用的。并且导出需要处理分层数据 (TreeDataProvider) 以及仅列出的数据 (ListDataProvider)。

    代码到此为止,我继续写更简单的ListDataProvider

    DataProvider dataProvider = grid.getDataProvider();
    ListDataProvider listContainer = (ListDataProvider) dataProvider;
    List<Grid.Column> columns = grid.getColumns();
    for (Grid.Column column : columns)
    {
        for (Object item : listContainer.getItems())
        {
            ValueProvider valueProvider = column.getValueProvider();
            Object appliedValue = valueProvider.apply(item);
            String sValue = appliedValue == null ? null : appliedValue.toString()
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      • 2016-07-09
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      相关资源
      最近更新 更多