2013-01-09 29 views
1

我有一個豐富的數據表,可以過濾列。rich:dataTable從filterBy列獲得總數

<!-- Data table with filters --> 
<h:form> 
<rich:dataTable value="#{sessionScope.paymentsBean.payments}" var="payment" 
    id="table"> 
    <rich:column filterBy="#{sessionScope.payment.invoice}" filterEvent="onkeyup"> 
     <f:facet name="header">Invoice</f:facet> 
     <h:outputText value="#{sessionScope.payment.invoice}" /> 
    </rich:column> 
    <rich:column filterBy="#{sessionScope.payment.description}" filterEvent="onkeyup"> 
     <f:facet name="header">Description</f:facet> 
     <h:outputText value="#{sessionScope.payment.description}" /> 
    </rich:column> 
    <rich:column filterBy="#{sessionScope.payment.amount}" filterEvent="onkeyup"> 
     <f:facet name="header">Amount</f:facet> 
     <h:outputText value="#{sessionScope.payment.amount}" /> 
    </rich:column> 
</rich:dataTable> 
</h:form> 

<!-- Total --> 
<h:outputText id="total" value="#{sessionScope.paymentsBean.total}" > 
    <f:convertNumber maxFractionDigits="2" type="currency" currencySymbol="$"/> 
</h:outputText> 

總的來說,我可以在sessionScope.paymentsBean.payments中總結所有金額以獲得總數。在下面的例子中,這是$ 355.00。

Invoice  Description  Amount 
1   Cash   $5.00 
2   Visa   $50.00 
3   Visa   $100.00 
4   MasterCard  $200.00 

Total: $355.00 

但是,如果我的「簽證」過濾器,桌子和總會是什麼樣子:

Invoice  Description  Amount 
2   Visa   $50.00 
3   Visa   $100.00 

Total: $355.00 

總應該是$ 150,但getTotal()不知道的filterBy數據。 有沒有一種方法可以根據rich:datatable中的filterBy條件動態計算總數?

+0

您可以指定您正在使用的RichFaces和JSF版本嗎? –

+0

當然,我正在使用JSF 1.2和Richfaces 3.3.3 Final。我無法對這些庫進行任何升級,因爲這是一個更大項目的一部分,但很高興知道JSF 2或Richfaces 4是否支持它。 –

+0

帶有PrimeFaces的JSF 2您可以確實這樣做,因爲Datatable綁定到兩個列表,主列表和過濾列表,因此您的支持bean中始終有可用的過濾列表。隨着PF 1.2和豐富的3.3,我想我做了類似的事情,我會看看。 –

回答

0

有一種方法可以恢復過濾的數據。你需要把表綁定到一個支持bean屬性,你需要它是一個rich:extendedDataTable

<rich:extendedDataTable value="#{sessionScope.paymentsBean.payments}" var="payment" id="table" binding="sessionScope.paymentsBean.table">

綁定屬性將是HTMLExtendedDataTable類型。之後,您需要創建一個Ajax當用戶在過濾器中輸入某些內容時纔會調用。見<a4j:support />組件,並使用它,當一個鍵被按下,如:

<a4j:support event="onkeyup" reRender="countBox" action="#{sessionScope.paymentsBean.actionCalculateTotalValue}"/>

記住調用的濾波can be tricky Ajax的方法。我誠懇地建議避免使用表格內置的過濾器,並創建基於h:inputText的自定義過濾器,並在此實現您的ajax調用。你可以看看這個link

一旦調用該方法,您只需獲取過濾行,計算總量並放入一個變量中,當調用完成後,JSF將通過該變量更新該框。獲取過濾行的方式是什麼?你有:

public List<E> filteredList() { 
    List<E> list = new java.util.ArrayList<E>(); 

    int i = 0; 
    boolean loop = true; 

    while (loop) { 
     table.setRowKey(new Integer(i)); 
     if (table.isRowAvailable()) { 
      list.add((E) table.getRowData()); 
      i += 1; 
     } else { 
      loop = false; 
     } 
    } 

    table.setRowKey(null); 
    return list; 
} 

基本上它會進行循環,直到表中沒有更多的可用行。祝你好運。