PrimeFaces数据表格分页选择全部

4

我有一个p:datatable,它具有多选模式和分页器。

<p:datatable value=#{rows} selection=#{selectedRows} pagintor="true" rows="20" rowsPerPageTemplate="10,20,50,100" paginatorPosition="bottom">
  <p:column selectionMode="multiple"/>
  <p:ajax event="toggleSelect"/>
  ... columns ...
</p:datatable>

当我点击表头的复选框时,所有行都被选中。但是当我点击表头复选框选择所有行并想通过使用“selection”的值导出所选行时,它只返回20个对象。我期望当我使用表头复选框时,它会选择数据表格的所有行而不仅仅是当前页面的行。我的datatable有200多页,因此在使用分页器时导出所有行是非常繁琐的工作;)
我认为这可能是一个需要记录的错误,或者我漏掉了什么?我查看了文档,但它没有关于使用多选模式和分页的内容......感谢您的反馈!

这个回答解决了你的问题吗?[在datatable jsf primefaces中选择全部] (https://dev59.com/X37aa4cB1Zd3GeqPrott) - Selaron
4个回答

2

我有完全相同的需求 - 选择跨页面所有行

我的解决方法 - 提供一个<p:inputSwitch />来切换所有页面上的所有行。

复制并如下所示 -

<p:dataTable id="id" var="var" widgetVar="wvar" rowsPerPageTemplate="7,15" reflow="true"
    value="#{backingBean.dataModel}" paginator="true" rows="7" rowIndexVar="index" rowKey="#{var.id}"
    paginatorTemplate="{RowsPerPageDropdown} {FirstPageLink} {PreviousPageLink} {CurrentPageReport} {NextPageLink} {LastPageLink}"
    selection="#{backingBean.selectedItems}">
<c:facet name="header"...
<p:inputSwitch value="#{backingBean.allRecords}" onLabel="All" offLabel="None" >
    <p:ajax onstart="if (PF('wvar').getSelectedRowsCount() == 0) PF('wvar').selectAllRows(); else PF('wvar').unselectAllRows();" />
</p:inputSwitch>

private boolean allRecords;//Getter++Setter++

同时,如下所示定义了 toggleSelect 事件 -

<p:ajax event="toggleSelect" onstart="if (PF('wvar').getSelectedRowsCount() == 7 || PF('wvar').getSelectedRowsCount() == 15) PF('wvar').selectAllRows(); else PF('wvar').unselectAllRows();" />

这段代码中的715是来自于数据表格的rowsPerPageTemplate="7,15"设置。

在我的环境下(PrimeFaces 5.3),这个设置能够正常工作。


0

对于JSF 2,在选择模式为多选且 paginator=true 的数据表中选择所有行:在页面中

<p:dataTable widgetVar="tableArea" yourtags...>
     <p:ajax  event="toggleSelect" oncomplete="teste()" /> /// toggleSelect is dispared on click to checkbox header
     <p:column id="columnId" selectionMode="multiple"/>

In js:

function teste(){
  
 var checked = $(document).find(":checkbox")["0"].checked; ///Find checkbox header and verify if checkbox is checked
 if(checked == true){
  PF('tableArea').selectAllRows(); // if true, selectAllRows from datatable
 } else {
  PF('tableArea').unselectAllRows(); //
 }  
}


0
Sample Code:-

**JAVA (your backing bean class)
==============================**
//Stores the checked items from data table.
private List<String> selectedIds = new ArrayList<>();

private List<String> getSomeList() {
// return list of strings to data table
  return someList;
}

public void selectAllCheckboxes(ToggleSelectEvent event) {
if (selectedIds != null)  {
    selectedIds.clear();
    if (event.isSelected()) {
        selectedIds.addAll(someList); //Add all the elements from getSomeList()
    }
 }
}

**XHTML
=====**

<p:dataTable id="data-table-id" value="#{backingBean.someList}"
selection="#{backingBean.selectedIds}" rowKey="#{id}" var="id"                   
paginator="true" rows="10" paginatorPosition="bottom"
paginatorAlwaysVisible="false" rowSelectMode="checkbox"
rowsPerPageTemplate="10,20,30,50">

<p:column selectionMode="multiple" />
<p:ajax event="toggleSelect" 
update="@this"listener="#backingBean.selectAllCheckboxes}"/>

</p:dataTable>

虽然这段代码可能回答了问题,但提供有关它如何以及为什么解决问题的额外上下文会提高答案的长期价值。 - Piotr Labunski
selection="selectedIds" 保存了一个复选框项目列表。要选择数据表中的所有项目,请将整个列表添加到 "selectedIds" 中,这样所有项目都将默认选中。 - Riju

-1
我期望当我使用表头复选框时,它会选择数据表的所有行,而不仅仅是当前页面的行。

这是一个错误的期望。

我认为这是一个我应该记录的错误,

不是的。

还是我漏掉了什么?

不,这是设计如此。所以除了你有错误的期望之外,你没有错过任何东西。你是SO上第一个提出这个问题的人,如果你计算PrimeFaces论坛中的请求数量,那么你是第二个提出这个问题的人。

甚至GMail也不会这样做。他们给你选择当前页面上的所有邮件的选项,当你这样做时,他们会给你一个额外的选项来选择所有页面上的所有邮件


2
这些不是有效的参数。似乎更多的是没有被考虑到,因此被接受为设计选择。也许没有人想过这个问题?也许有些人懒得去选择每一页,而不是想知道为什么不能有一个选择所有页面的复选框?最重要的是,如果在Gmail中没有人关心,为什么他们还要添加选择所有页面的功能呢?;) 显然,Gmail用户也有这个期望...无论如何,如果我考虑记录这个问题,它将作为一种增强功能(我的意思是不是bug),但首先需要找到一个优雅的方式。感谢您的澄清。 - onderbewustzijn
这个问题之前已经被问过了... 1次... 你是第二个。也许“全选”并不像你想象的那么必要,或者其他人有一个简单的解决方案... - Kukeltje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接