rich:dataTable从filterBy列获取总数

时间:2013-01-09 19:16:58

标签: jsf richfaces richdatatable

我有一个包含我可以过滤的列的丰富数据表。

<!-- 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

但是,如果按“Visa”过滤,表格和总数将如下所示:

Invoice     Description     Amount
2           Visa            $50.00
3           Visa            $100.00

Total: $355.00

总数应为150美元,但getTotal()不知道filterBy数据。 有没有办法根据rich:datatable?

中的filterBy条件动态计算总数

1 个答案:

答案 0 :(得分:0)

有一种方法可以恢复过滤后的数据。您需要将表绑定到支持bean属性,并且需要它为rich:extendedDataTable

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

Binded属性为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;
}

基本上它会循环,直到表中没有更多可用行。祝你好运。