如何在Vaadin 8网格中重新应用过滤器
我已将过滤器添加到我的网格中,如下所示:如何在Vaadin 8网格中重新应用过滤器,vaadin,vaadin8,vaadin-grid,Vaadin,Vaadin8,Vaadin Grid,我已将过滤器添加到我的网格中,如下所示: filterTextField.addValueChangeListener(event -> { myListDataProvider.addFilter( columnName, value-> value.toLowerCase().contain(filterTextField.getValue())); }); 这将设置并应用过滤器。但是,稍
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
使用多个过滤器对两者进行测试。在网格上创建文本字段作为过滤器,在映射中保留值,覆盖hasValue,在将数据提取到网格后添加通常,您可以调用触发
DataChangeEvent
,网格接收并更新UI。您的数据如何更改为需要调用grid.setItems(…)
?调用refreshAll()不起作用。例如,根据操作的细节,数据从一个数据库表传输到另一个数据库表,在这种情况下,只需重新加载网格就更容易了。问题是,当我重新加载网格时,过滤器在文本字段中仍然可见,但不再应用于网格。您是否使用数据提供程序从数据库或其他地方检索数据?我觉得如果你能提供一个
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);