<items> 从Vaadin 8网格获取列表



问题:我有一个Vaadin 8网格,我找不到提取其中项目的方法。

描述:从网格开始

Grid<Pojo> myGrid = new Grid<>();

我对它进行了配置,这样它就可以在延迟加载的情况下获取数据。

myGrid.setDataProvider(
(sortOrd, offset, limit) -> dao.getAllFiltered(offset, limit, filter),
() -> dao.getCountAllFiltered(filter)
);

在这一点上,我想从网格中提取所有项目(用于将其放入excel(,类似于List<Pojo> list = myGrid.getItems();。我也尝试过通过myGrid.getDataProvider(),但没有有用的getter

我找不到任何激励者,我该如何做到这一点?感谢

你基本上试过这个吗?

List<Pojo> list = grid.getDataProvider()
.fetch(new Query<>())
.collect(Collectors.toList());

所有DataProvider的实现上面提到的fetch(..(方法。也就是说,这个答案是普遍的。

还有其他方法,你也可以做:

List<Pojo> list = 
grid.getDataCommunicator.fetchItemsWithRange(0,grid.getDataCommunicator.getDataProviderSize());

另请参阅:在Vaadin 中调用FileDownloader时使用过滤后的dataProvider内容

与上述fetch(..(方法的不同之处在于,DataCommunicatior.fetchItemsWithRange将以当前在网格中排序和筛选的方式给出项目。

如果DataProvider是ListDataProvideer的实例,那么以下也是可能的,并推荐

ListDataProvider dataProvider = (ListDataProvider) grid.getDataProvider();
List<Pojo> list = dataProvider.getItems();

因此,这个问题至少有三个正确答案。哪个最合适取决于应用程序。

值得提醒的是,使用fetch(..(或fetchItemsWithRange(..(从懒惰加载的数据提供程序中获取所有项目,可能会导致巨大且消耗内存的数据库查询(即获取整个内容(。你可能不应该那样做。这就是为什么getItems((只在ListDataProvider中实现,而不包括在通用DataProvideer接口中。

TL;DR:你不能。网格利用数据提供程序来获取要显示的数据块(因此是计数/限制/偏移(。事实上,有迫切的数据源后端(直接设置项(只是为了让具有迫切数据的网格更容易。

因此,这里的解决方案是从实际来源(存储库等(中提取数据。所以在你的情况下,它是这样的:

dao.getAllFiltered(0, dao.getCountAllFiltered(filter), filter)

或者无论如何,这会让事情变得更简单。

最新更新