2017-10-21 11 views
1

J'ai ajouté des filtres à ma grille comme suit:Comment ré-appliquer des filtres dans Vaadin 8 Grille

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

Ceci définit et applique le filtre. Cependant plus tard, je réalise une action sur la grille qui nécessite un rechargement des éléments tels que:

grid.setItems(reloadItemsDueToAction()); 

Quand je fais le filterTextField est bien sûr remplir encore et la grille est rechargée, mais le problème est que je don Je ne sais pas comment réappliquer les filtres qui ont été réglés dans le ListDataProvider afin que la grille soit de nouveau filtrée selon le filterTextField. Les filtres doivent toujours être définis dans ListDataProvider mais comment les appliquer dans la grille?

+1

Généralement, vous pouvez appeler ['dataProvider.refreshAll()'] (https://vaadin.com/api/8.1.5/com/vaadin/data/provider/DataProvider.html#refreshAll--) qui déclenche un 'DataChangeEvent', la grille le reçoit et met à jour l'interface utilisateur. Comment vos données changent-elles pour nécessiter un appel à 'grid.setItems (...)'? – Morfic

+0

L'appel de refreshAll() ne fonctionne pas. Un exemple d'action serait celui où les données sont transférées d'une table de base de données à une autre en fonction des détails de l'action, auquel cas il est plus facile de simplement recharger la grille. Le problème est que lorsque je recharge la grille, les filtres sont toujours visibles dans TextField mais ne sont plus appliqués sur la grille. –

+0

Utilisez-vous le fournisseur de données pour extraire les données de la BD ou autre chose? Je pense que ce serait plus facile si vous pouviez fournir un [sscce] (http://sscce.org) – Morfic

Répondre

1

Il me semble qu'actuellement (8.1.5), il est possible que par la mise à nouveau le DataProvider et les filtres, par exemple:

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 

de la même façon appliquée précédemment aussi avec Table/Container.

Si vous utilisez setItems() je suppose que Grid n'utilise plus les filtres et la mise DataProvider précédente à DataProvider précédente ne se propage pas à Grid. Je ne sais pas s'il est sage, mais si vous avez vraiment besoin d'utiliser setItems() alors peut-être quelque chose comme ceci:

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); 

testé à la fois avec plusieurs filtres.