我有一个数据表,它有分页器和过滤器。当表被过滤而不是在第一页,并且我试图删除一行时,我希望同时保留过滤器和当前页。所以我尝试这样做:
try {
List<Vector> filteredData = incomeTable.getFilteredValue();
Map<String, Object> filterValue = incomeTable.getFilters();
if (filteredData == null) {
filteredData = lstData;
}
int index = filteredData.indexOf(selectedRow);
lstData.remove(selectedRow);
filteredData.remove(selectedRow);
if (filteredData.size() > index) {
selectedRow = filteredData.get(index);
} else {
selectedRow = filteredData.get(index - 1);
}
onRowSelect();
incomeTable.setFilteredValue(filteredData);
incomeTable.setFilters(filterValue);
incomeTable.setFirst(getFirstRecordShow(filteredData));
} catch (Exception e) {
reportException(e);
}
处理完这个函数后,我更新了客户端的表:
update="@([id$=incomeTable])"
我能够保留当前页面,过滤数据列表并正确显示所选行。但是我在标题行上使用的过滤器被清除了。我已经试过了
incomeTable.setFilters(filterValue);
重新设置值,但仍然不工作。
有没有人知道在这种情况下如何保持过滤器和当前页面?
我的PrimeFaces版本是5.3
经过一些测试后,结果变得相当简单。
就像在使用分页时切换列可见一样(使用boolean[]),创建一个String[]来保存所有的过滤器值
private String[] colVisible = new String[] {"", "", "", "", ...};
为每一列添加filterValue属性:
<p:column headerText="Header text"
filterBy="#{item[1]}" filterMatchMode="contains"
visible="#{bean.colVisible[1]}"
filterValue="#{bean.filterValue[1]}">
<h:outputText value="#{item[1]}" />
</p:column>
这样,即使在更新之后,过滤器值也将保持不变。然后当我需要清除过滤器时,我只需要将它们重置为空白。