【问题标题】:Sum Column Datatable in PrimeFacesPrimeFaces 中的求和列数据表
【发布时间】:2013-05-29 12:31:13
【问题描述】:

我通过 ListDataModel 在 JSF 页面中接收数据。
我需要对列的所有值求和。
遵循 JSF 代码:

<p:dataTable id="table" value="#{ProductBean.listProduct}" var="item" style="font-size:"12px" >
<p:column >
   <f:facet name="header">
      <h:outputText value="NAME" />
   </f:facet >
   <h:outputText value="#{item[0].name}" />
</p:column >
<p:column >
   <f:facet name="header">
      <h:outputText value="VALUE BUY" />
   </f:facet >
   <h:outputText value="#{item[1].valuebuy}" />
</p:column >
<p:column >
   <f:facet name="header">
      <h:outputText value="VALUE SELL" />
   </f:facet >
   <h:outputText value="#{item[2].valuesell}" />
</p:column >
<p:columnGroup type="footer">  
    <p:row>                                        
       <p:column footerText="Total" />  
       <p:column footerText="TotalBuy" />   <<<<--------- Sum All Values of item[1].valuebuy and show here
       <p:column footerText="TotalSell" />  <<<<--------- Sum All Values of item[2].valuesell and show here                  
    </p:row>  
</p:columnGroup>
</p:dataTable >

【问题讨论】:

    标签: jsf primefaces datatable


    【解决方案1】:

    只需在&lt;p:column&gt; 中添加一个&lt;f:facet name="footer"&gt;,它将包含必要的信息并调用一个bean 方法来获取它。

    基本示例:

    观点:

    <p:dataTable id="table" value="#{productBean.products}" var="product">
        <p:column>
            <f:facet name="header">
                <h:outputText value="NAME" />
            </f:facet>
            <h:outputText value="#{product.name}" />
            <f:facet name="footer">
                <h:outputText value="Total" />
            </f:facet>
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="VALUE BUY" />
            </f:facet>
            <h:outputText value="#{product.valueBuy}" />
            <f:facet name="footer">
                <h:outputText value="#{productBean.valueBuyTotal}" />
            </f:facet>
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="VALUE SELL" />
            </f:facet>
            <h:outputText value="#{product.valueSell}" />
            <f:facet name="footer">
                <h:outputText value="#{productBean.valueSellTotal}" />
            </f:facet>
        </p:column>
    </p:dataTable>
    

    豆子:

    public class ProductBean {
    
        private List<Product> products;
    
        @PostConstruct
        public void init() {
            //load products in some way, like products = service.list();
        }
    
        public int getValueBuyTotal() {
            int quantity = 0;
            for(Product p : products) {
                quantity += p.getValueBuy();
            }
            return quantity;
        }
    
        public int getValueSellTotal() {
            int quantity = 0;
            for(Product p : products) {
                quantity += p.getValueSell();
            }
            return quantity;
        }
    
    }
    

    型号:

    public class Product {
    
        String name;
        int valueBuy;
        int valueSell;
    
    }
    

    【讨论】:

    • 与其使用虚假的getter方法,不如将总和保存在托管bean的字段中。
    • @LuiggiMendoza 是的,但如果 OP“修改”产品的值,他需要在 setter 方法中更新适当的总和,以使其始终保持一致。由于它在表面不可见,因此这种方法基本上是“动态安全的”。
    • 每次修改列表都可以调用该方法计算总和:)。
    • @LuiggiMendoza 是的,但根据设计,它可能比普通的加/减操作更消耗内存。在任何情况下,拥有一个字段基本上总是正确的,尤其是如果您打算在代码中处理它,不要忘记不在 getter 中做业务工作的重要性
    猜你喜欢
    • 2012-06-06
    • 2013-02-17
    • 2013-12-19
    • 2013-03-09
    • 1970-01-01
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多