我如何Vaadin 8重新应用滤镜电网
问题描述:
添加过滤器到我的网格,如下列:我如何Vaadin 8重新应用滤镜电网
filterTextField.addValueChangeListener(event -> {
myListDataProvider.addFilter(
columnName,
value-> value.toLowerCase().contain(filterTextField.getValue()));
});
这集和应用过滤器。不过后来我执行对电网这需要项目的重载,使得操作:
grid.setItems(reloadItemsDueToAction());
当我做到这一点,filterTextField
当然仍填充和网格重新加载,但问题是,我不不知道如何重新应用ListDataProvider
中设置的过滤器,以便根据filterTextField
再次过滤网格。过滤器仍然应该在ListDataProvider中设置,但是如何在网格中应用它们?
答
在我看来,目前(8.1.5),可以仅通过重新设置了DataProvider和过滤器,例如:
private ListDataProvider<Entity> ldp
= new ListDataProvider<>(getGridItems()); // initial grid data
// then somewhere update grid & re-apply filters
SerializablePredicate<Entity> filter = ldp.getFilter(); // store filter
ldp = new ListDataProvider<>(getGridItems()); // new ldp with fresh data
grid.setDataProvider(ldp); // instead of setItems()
if(filter!=null) ldp.addFilter(filter); // re-apply stored filter
同样的方式应用较早也与Table/Container
。
如果使用setItems()
我猜Grid
不再被使用以前DataProvider
并设置过滤器来以前DataProvider
将不会传播到Grid
。我不知道这是否是明智的,但如果你真的需要使用setItems()
那么也许是这样的:
ListDataProvider<Entity> ldp = ((ListDataProvider<Entity>)g.getDataProvider());
SerializablePredicate<Entity> filter = ldp.getFilter();
grid.setItems(getGridItems());
ldp = ((ListDataProvider<Entity>)g.getDataProvider());
if(filter!=null) ldp.addFilter(filter);
测试都以多个滤波器。
通常你可以调用['dataProvider.refreshAll()'](https://vaadin.com/api/8.1.5/com/vaadin/data/provider/DataProvider.html#refreshAll--)触发一个'DataChangeEvent',网格接收它并更新UI。你的数据如何改变,需要调用'grid.setItems(...)'? – Morfic
调用refreshAll()不起作用。一个示例动作就是将数据从一个数据库表转移到另一个数据库表,这取决于动作的细节,在这种情况下,只需重新加载网格即可。问题是,当我重新加载网格时,过滤器在TextField中仍然可见,但不再应用在网格上。 –
您是使用数据提供程序从数据库还是其他位置检索数据?我觉得如果你能提供[sscce](http://sscce.org)会更容易些, – Morfic