2017-10-21 66 views
1

添加过滤器到我的网格,如下列:我如何Vaadin 8重新应用滤镜电网

filterTextField.addValueChangeListener(event -> { 
     myListDataProvider.addFilter(
       columnName, 
       value-> value.toLowerCase().contain(filterTextField.getValue())); 
    }); 

这集和应用过滤器。不过后来我执行对电网这需要项目的重载,使得操作:

grid.setItems(reloadItemsDueToAction()); 

当我做到这一点,filterTextField当然仍填充和网格重新加载,但问题是,我不不知道如何重新应用ListDataProvider中设置的过滤器,以便根据filterTextField再次过滤网格。过滤器仍然应该在ListDataProvider中设置,但是如何在网格中应用它们?

+1

通常你可以调用['dataProvider.refreshAll()'](https://vaadin.com/api/8.1.5/com/vaadin/data/provider/DataProvider.html#refreshAll--)触发一个'DataChangeEvent',网格接收它并更新UI。你的数据如何改变,需要调用'grid.setItems(...)'? – Morfic

+0

调用refreshAll()不起作用。一个示例动作就是将数据从一个数据库表转移到另一个数据库表,这取决于动作的细节,在这种情况下,只需重新加载网格即可。问题是,当我重新加载网格时,过滤器在TextField中仍然可见,但不再应用在网格上。 –

+0

您是使用数据提供程序从数据库还是其他位置检索数据?我觉得如果你能提供[sscce](http://sscce.org)会更容易些, – Morfic

回答

1

在我看来,目前(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); 

测试都以多个滤波器。