2017-10-21 2 views
1

I Filter meinem Gitter wie die folgenden hinzugefügt haben:Wie erneut anwenden Filter in Vaadin 8 Grid

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

den Filter Diese Sätze und wendet. Jedoch später führe ich eine Aktion auf dem Gitter, das ein erneutes Laden der Elemente erfordert, so dass:

grid.setItems(reloadItemsDueToAction()); 

Wenn ich dies tun, die filterTextField natürlich noch bevölkern und das Gitter neu geladen wird, aber das Problem ist, dass ich don weiß nicht, wie man die Filter, die in ListDataProvider gesetzt wurden, erneut anwendet, so dass das Gitter wieder entsprechend der filterTextField gefiltert wird. Die Filter sollten weiterhin im ListDataProvider gesetzt werden, aber wie kann ich sie im Grid anwenden?

+1

Normalerweise können Sie ['dataProvider.refreshAll()'] (https://vaadin.com/api/8.1.5/com/vaadin/data/provider/DataProvider.html#refreshAll--) aufrufen, was a auslöst 'DataChangeEvent', das Grid empfängt es und aktualisiert die Benutzeroberfläche. Wie ändern sich Ihre Daten, um einen Aufruf von 'grid.setItems (...)' zu erfordern? – Morfic

+0

Der Aufruf von refreshAll() funktioniert nicht. Eine Beispielaktion wäre eine, bei der die Daten abhängig von den Details der Aktion von einer Datenbanktabelle in eine andere übertragen werden. In diesem Fall ist es einfacher, das Raster neu zu laden. Das Problem besteht darin, dass die Filter beim Laden des Rasters immer noch im TextField sichtbar sind, aber nicht mehr auf das Raster angewendet werden. –

+0

Verwenden Sie den Datenprovider zum Abrufen der Daten aus der Datenbank oder etwas anderem? Ich denke, es wäre einfacher, wenn Sie eine [sscce] (http://sscce.org) zur Verfügung stellen könnten. – Morfic

Antwort

1

Es scheint mir, dass zur Zeit (8.1.5) ist es möglich, nur durch die DataProvider- Einstellung und Filter wieder, zum Beispiel:

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 

Die gleiche Art und Weise mit Table/Container früher ebenfalls angewandt.

Wenn Sie setItems() verwenden Ich denke, Grid ist nicht mehr die vorherige DataProvider mit und Filter zur vorherigen DataProvider Einstellung nicht zu Grid propagieren. Ich weiß nicht, ob es klug ist, aber wenn Sie wirklich setItems() verwenden müssen, um dann vielleicht so etwas wie folgt aus:

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

getestet sowohl mit mehreren Filtern.