Ваадин: Гирлянда фильтров?

У меня сейчас есть эта конкретная проблема - у меня есть сетка, в которой я пытаюсь фильтровать данные с помощью нескольких фильтров. Для этого я использую текстовые поля, которые служат полями ввода для моего критерия фильтрации.

Моя сетка состоит из трех столбцов (имя, фамилия, адрес), и я хотел бы иметь возможность связывать операции фильтрации одну за другой. Все значения взяты из базы данных MySQL.

По сути, процесс фильтрации должен выглядеть следующим образом:

FirstName ^ LastName ^ Address

Например, сетка из трех столбцов:

введите здесь описание изображения

table

И в фильтре для столбца First Name я ввожу переменные Aa, в результате чего таблица будет выглядеть так:

введите здесь описание изображения

table1

Однако, если я решил ввести D в фильтр фамилии, он вернет такие результаты (игнорирует изменения, внесенные первым фильтром):

введите здесь описание изображения

table3

Вместо ожидаемого результата, который будет выглядеть так:

введите здесь описание изображения  введите описание изображения здесь

Я использую фильтрацию по сетке следующим образом:

firstNameFilter.addValueChangeListener( e->
    {
        Notification.show(e.getValue());

        ldp.setFilter(desc -> 
        {
            return StringUtils.containsIgnoreCase(desc.getFName(), firstNameFilter.getValue());
        });
    });     
    firstNameFilter.setValueChangeMode(ValueChangeMode.EAGER);

Как лучше всего фильтровать несколько столбцов с учетом предыдущих действий фильтра?


person JoffJoff    schedule 21.02.2020    source источник


Ответы (1)


listDataProvider.setFilter(...) перезапишет любой существующий фильтр.
Я написал ответ по этой теме с готовым полным примером кода для копирования и вставки, а также снимки экрана, показывающие, что несколько фильтров работают должным образом.
Самый важный вывод из этого:

Каждый раз, когда изменяется какое-либо значение фильтра, я сбрасываю текущий фильтр с помощью setFilter. Но в этом новом фильтре я проверю значения ВСЕХ полей фильтра, а не только значение поля, значение которого только что изменилось. Другими словами, у меня всегда активен только один единственный фильтр, но этот фильтр учитывает все определенные значения фильтра.


Вот как это может выглядеть с вашим кодом:

firstNameFilter.addValueChangeListener( e-> this.onFilterChange());
lastNameFilter.addValueChangeListener( e-> this.onFilterChange());
addressFilter.addValueChangeListener( e-> this.onFilterChange());
// sidenote: all filter fields need ValueChangeMode.EAGER to work this way


private void onFilterChange(){
    ldp.setFilter(desc -> {
        boolean fNameMatch = true;
        boolean lNameMatch = true;
        boolean addressMatch = true;

        if(!firstNameFilter.isEmpty()){
            fNameMatch = StringUtils.containsIgnoreCase(desc.getFName(), firstNameFilter.getValue());
        }
        if(!lastNameFilter.isEmpty()){
            lNameMatch = StringUtils.containsIgnoreCase(desc.getLName(), lastNameFilter.getValue());
        }
        if(!addressFilter.isEmpty()){
            addressMatch = StringUtils.containsIgnoreCase(desc.getAddress(), addressFilter.getValue());
        }

        return fNameMatch && lNameMatch && addressMatch;
    });
});     
person kscherrer    schedule 21.02.2020