[英]Accessing Vaadin 8 Grid cell value
我正在从 Vaadin 7 Table 迁移到 Vaadin 8 Grid。 在 Vaadin 7 表中,我们使用 IndexedContainer 或 Container with Property 并且可以使用IndexedContainer.getItem(propertyId).getItemProperty(itemId).getValue();
访问表单元格值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 */
}
}
这取决于你将如何处理数据/单元格,但这是我的镜头:
首先: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
, List
可能会更舒服List<Entity> list = streamEntities.collect(Collectors.toList());
首先,我将回答问题,然后展示我的解决方案。
@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()
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.