Primefaces Datatable动态计算

时间:2013-11-05 16:34:03

标签: primefaces datatable filtering

在我的视图层中,我使用了包含9列的Primefaces Datatable,最后一列具有浮点值(列名='Valor')。

有一个名为'prefDep'的整数列,它的值有一个过滤器(顺便说一下,foreignKey值):

<!-- column name omitted -->   
<p:column sortBy="#{item.prefDep}" filterBy="#{item.prefDep}">
  <h:outputText value="#{item.prefDep}"/>
</p:column>

Datatable的最后一行有一个固定 GrandTotal,它是所提到的'Valor'列的总和:

<p:columnGroup type="footer">
  <p:row>
    <p:column colspan="8" footerText="Grand Total:" />
    <p:column footerText="#{upbController.totalLosses}" />
  </p:row>
</p:columnGroup>

控制器类中获取总和的方法:

public int getTotalLosses() {  
  int total = 0;  
    for(Upb id : getItems()) {  
      total += id.getValor();
    }  
     return total;  
}  

我想要的是:当我过滤数据表时,我想仅为过滤的值部分显示相应的GrandTotal,而不是“固定的”总和。

我该怎么做?

提前致谢。

-

节后:

在我的AbstractController中,我有:

private List<T> filteredUpb;
//...
public List<T> getFilteredUpb() {
    if (filteredUpb == null) {
        filteredUpb = this.ejbFacade.findAll();
    }
    return filteredUpb;
}

在我的UpbController(managedBean)中:

private List<Upb> filteredUpb = null;
//...
public int getPerdasTotal() {
    int total = 0;
    for (Upb id : getFilteredUpb()) {
        total += id.getVlOco();
    }
    return total;
}

在jsf:

<p:column>
  <f:facet name="footer">
    <h:outputText value="#{upbController.perdasTotal}" />
  </f:facet>
</p:column>

1 个答案:

答案 0 :(得分:1)

为了不让这个问题得不到回答,这个问题的解决方案(见下文)可以在我的另一篇文章中找到:Dynamic Calculation Using Filter in Datatable

我认为您可以在PF数据表过滤和/或分页上定义AJAX调用。

<p:dataTable value="#{myBackingBean.values}" var="row" filteredValue="#{myBackingBean.filteredValues}" >
<p:ajax event="filter" listener="#{myBackingBean.updateSum}" update="componentToUpdate" />
//...
</p:dataTable>

在您的updateSum()方法中,您可以浏览filteredValues集合来开展业务。

您可能难以定位数据表中包含的更新组件,但可以通过向代码中添加styleClass="footerToUpdate"之类的内容并在更新中使用update="@(.footerToUpdate)"

来解决此问题。