primefaces数据表选择all with paginator

时间:2016-01-29 13:25:41

标签: primefaces datatable pagination

我有一个p:datatable,有多种选择模式和一个paginator。

<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个对象。我希望当我使用标题复选框时,它会选择数据表的所有行,而不仅仅是页面中的一行。我有一个超过200页的数据表,所以你可以想象使用paginator导出所有这些是非常繁琐的工作;)。

我想这是我应该记录的错误,或者我错过了什么?我仔细查看了文档,但它没有说明将多个选择模式与分页一起使用...感谢您的反馈!

4 个答案:

答案 0 :(得分:1)

我有完全相同的要求 - select all rows across pages

我做了什么 - 提供了<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)

答案 1 :(得分:0)

  

我希望当我使用标题复选框时,它会选择数据表的所有行,而不仅仅是页面中的一行。

这是一个错误的期望。

  

我想这是我应该记录的错误,

不。

  

或者我错过了什么?

不,这是设计上的。除了错误的期望之外你不会错过任何东西。如果你在PrimeFaces论坛中计算请求的数量,那么你是SO中第一个提出这个问题而第二个问题就是这个事实。

甚至GMail都没有这样做。他们为您提供了选择您所在页面上所有消息的选项,当您执行此操作时,他们会为您提供其他选项,以选择所有网页上的所有消息

答案 2 :(得分: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>

答案 3 :(得分:-1)

对于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"/>

在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(); //
	}		
}