1

フィルタリングできる列を含む豊富なデータテーブルがあります。

<!-- 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基準に基づいて合計を動的に計算する方法はありますか?

4

1 に答える 1

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}"/>

フィルタリングで Ajax メソッドを呼び出すのは難しい場合があることを覚えておいてください。h:inputTextテーブルの組み込みフィルターを避け、ここに基づいてカスタムフィルターを作成し、ここで ajax 呼び出しを実装することを心からお勧めします。このリンクをご覧ください。

メソッドが呼び出されたら、フィルタリングされた行を取得し、合計金額を計算して、呼び出しが終了したときに 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;
}

基本的に、テーブルに使用可能な行がなくなるまでループします。幸運を。

于 2013-01-11T07:09:19.650 に答える