Jof*_*off 3 java vaadin vaadin-grid vaadin10
我现在有这个特殊问题 - 我有一个网格,我试图通过多个过滤器过滤数据。为此,我使用文本框作为过滤条件的输入字段。
我的网格有三列(名字、姓氏、地址),我希望能够一个接一个地链接过滤操作。所有值均取自 MySQL 数据库。
本质上,过滤过程应该是这样的:
FirstName ^ LastName ^ Address
Run Code Online (Sandbox Code Playgroud)
例如,具有三列的网格:
在 First Name 列的过滤器中,我输入了 variables Aa,这将导致表如下所示:
但是,如果我决定输入D姓氏过滤器,它会返回如下结果(忽略第一个过滤器的修改):
而不是看起来像这样的预期结果:
我通过网格过滤的方式是这样的:
firstNameFilter.addValueChangeListener( e->
{
Notification.show(e.getValue());
ldp.setFilter(desc ->
{
return StringUtils.containsIgnoreCase(desc.getFName(), firstNameFilter.getValue());
});
});
firstNameFilter.setValueChangeMode(ValueChangeMode.EAGER);
Run Code Online (Sandbox Code Playgroud)
考虑到以前的过滤操作,过滤多列的最佳方法是什么?
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;
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
128 次 |
| 最近记录: |