简体   繁体   English

如何在Vaadin 8中添加网格过滤器?

[英]How to add grid filters in Vaadin 8?

Vaadin 8 just came out. 瓦丁8刚刚出来。 the adding of filters in Grid was never in their documentation, i only found one working solution here in stackoverflow. 在网格过滤器的文档中添加从来没有,我只找到一个可行的解决方案在这里的计算器。

  HeaderCell cell = filterRow.getCell(pid);
                    // Have an input field to use for filter
                    TextField filterField = new TextField();
                    filterField.setColumns(0);
                    filterField.setHeight("23");



                    // Update filter When the filter input is changed
                    filterField.addTextChangeListener(change -> {
                        // Can't modify filters so need to replace
                        b.removeContainerFilters(pid);

                        // (Re)create the filter if necessary
                        if (! change.getText().isEmpty())
                            b.addContainerFilter(
                                new SimpleStringFilter(pid,
                                    change.getText(), true, false));
                    });
                    cell.setComponent(filterField);

But now since the update, this Solution is no longer working since SimpleStringFilter is no longer available in the new grid, and BeanItemContainer are not recognized anymore and only allows setItems() to fill grid data. 但是现在自更新以来,此解决方案不再有效,因为SimpleStringFilter在新网格中不再可用,并且BeanItemContainer不再被识别,只允许setItems()填充网格数据。

Can anyone help me update this code for Vaadin 8? 任何人都可以帮我更新Vaadin 8的代码吗?

It's possible to add filtering for Vaadin 8 Grid. 可以为Vaadin 8 Grid添加过滤功能。

Let's assume we have defined Person model as: 假设我们已将Person模型定义为:

final class Person {

    private String name;

    public Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}

Our Grid implementation would look like this: 我们的Grid实现如下所示:

final class PersonGrid extends Grid<Person> {

    public PersonGrid() {
        List<Person> persons = new ArrayList<>();
        persons.add(new Person("foo"));
        persons.add(new Person("bar"));
        persons.add(new Person("foobar"));

        addColumn(Person::getName).setCaption("Name");

        setItems(persons);
    }

}

Now, we can create a layout with a TextField that will be our filter: 现在,我们可以使用TextField创建一个布局,它将成为我们的过滤器:

final class FilteredGridLayout extends VerticalLayout {

    private final PersonGrid personGrid;
    private final TextField nameFilter;

    public FilteredGridLayout() {
        nameFilter = new TextField();
        nameFilter.setPlaceholder("Name...");
        nameFilter.addValueChangeListener(this::onNameFilterTextChange);
        addComponent(nameFilter);

        personGrid = new PersonGrid();
        addComponentsAndExpand(personGrid);
    }

    private void onNameFilterTextChange(HasValue.ValueChangeEvent<String> event) {
        ListDataProvider<Person> dataProvider = (ListDataProvider<Person>) personGrid.getDataProvider();
        dataProvider.setFilter(Person::getName, s -> caseInsensitiveContains(s, event.getValue()));
    }

    private Boolean caseInsensitiveContains(String where, String what) {
        return where.toLowerCase().contains(what.toLowerCase());
    }

}

The result is shown below: 结果如下所示: 使用Vaadin 8 Grid过滤

For empty input result is: foo , bar and foobar . 对于空输入结果是: foobarfoob​​ar

For foo result is: foo and foo bar. 对于foo,结果是: foofoo bar。

For bar result is: bar and foo bar . 对于酒吧结果是: 酒吧和foo 酒吧

For foobar result is: foobar . 对于foob​​ar结果是: foob​​ar

There's Vaadin grid addon which will be ported to Vaadin 8 later, so if you have time to wait for it you can get filter row in pretty package. 有Vaadin网格插件,稍后将被移植到Vaadin 8,所以如果你有时间等待它,你可以在漂亮的包中获得过滤器行。

https://vaadin.com/directory#!addon/gridutil https://vaadin.com/directory#!addon/gridutil

Please read here estimation of effort from author of GridUtil. 请在此阅读GridUtil作者的努力估算。

https://github.com/melistik/vaadin-grid-util/issues/37#issuecomment-282756130 https://github.com/melistik/vaadin-grid-util/issues/37#issuecomment-282756130

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM