更新PrimeFaces数据表时如何保持筛选器和当前页面

更新PrimeFaces数据表时如何保持筛选器和当前页面,primefaces,filter,datatable,Primefaces,Filter,Datatable,我有一个带有分页器和过滤器的数据表。当表格被筛选,而不是在第一页,并且我尝试删除一行时,我希望保留筛选器和当前页。所以我试过这样的方法: try { List<Vector> filteredData = incomeTable.getFilteredValue(); Map<String, Object> filterValue = incomeTable.getFilters(); if (f

我有一个带有分页器和过滤器的数据表。当表格被筛选,而不是在第一页,并且我尝试删除一行时,我希望保留筛选器和当前页。所以我试过这样的方法:

  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);
        }
我能够保留当前页面、过滤数据列表并正确显示所选行。但是我在标题行上使用的过滤器被清除了。我已经试过了

incomeTable.setFilters(filterValue); 
重新设置该值,但仍不起作用

在这种情况下,有人知道如何同时保留筛选器和当前页面吗


我的PrimeFaces版本是5.3。

经过一些测试,结果非常简单

就像在使用分页时切换可见列一样(使用布尔值[]),创建一个字符串[],它将保存所有筛选器值

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>


这样,即使在更新之后,过滤器值也将保持不变。然后,当我需要清除过滤器时,我只需要将它们全部重置为空白。

@Jasper de Vries:在这种情况下,你没有阅读我所有的要求吗?我想保留当前页面,所以clearFilters或filter都不可接受,因为它们会将paginator移回第一页。OK。我改进了你的问题。我稍后会看一看,为什么不干脆不更新datatable,直接使用ajax调用删除行服务器端,并在ajax调用完成后使用一些简单的jquery将其从客户端删除呢?不需要过滤什么的。唯一的缺点是页面现在包含“rows-1”行。@Kukeltje:如何删除客户端的行?PF(“incomeTable”)除了removeSelection之外没有任何remove函数。另外,如果我试图通过删除整个元素将其从视图中删除,我的表的索引列将不会得到更新,因此会有一个缺少的索引,对吗?缺少的索引会导致问题吗?很酷,很好的解决方案。出于好奇,您是否尝试使用6.0来实现此功能?如果我没记错的话,在5.3和6.0之间,在这方面有些事情发生了变化。小挑剔:colVisible不应该是filterValue(和privagte private;-)@Kukeltje:我还没有尝试过6.0,因为我们的PM在我们完成开发阶段之前不允许我们升级,但可能在维护这个网站时。关于colVisible,它用于显示或隐藏列。将p:ColumntToggler与paginator一起使用时,如果更改页面,primeface表将保留您选择显示的列标题的数量,但每行将显示所有列。因此,它使标题和行值不匹配。
<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>