2017-10-21 6 views
1

私は次のような私のグリッドにフィルタを追加したどのように再適用するフィルタVaadin 8グリッド内

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

これが設定され、フィルタを適用します。しかし、後で私がするようなアイテムのリロード必要グリッド上でアクションを実行:私はこれを行うと

grid.setItems(reloadItemsDueToAction()); 

filterTextFieldはもちろんですまだ移入し、グリッドがリロードされるが、しかし問題は、Iドンであります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

データプロバイダを使用してDBなどのデータを取得していますか?あなたが[sscce](http://sscce.org)を提供できるなら、 – Morfic

答えて

1

現在(8.1.5)それだけ、たとえば、再びデータプロバイダとフィルタを設定することで可能であるように私には思える:

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を使用してGridに伝播しません以前DataProviderにフィルタを設定していないと思います。複数のフィルタを使用してテスト

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

両方:あなたは本当に、このような多分何かをsetItems()を使用する必要がある場合、私はそれが賢明であるかどうかを知りませんが。

関連する問題