【问题标题】:rich:dataTable getting the total from filterBy columnsrich:dataTable 从 filterBy 列中获取总数
【发布时间】:2012-12-24 01:29:57
【问题描述】:

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

<!-- 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标准动态计算总数?

【问题讨论】:

  • 你能指定你正在使用的 RichFaces 和 JSF 版本吗?
  • 当然,我使用的是 JSF 1.2 和 Richfaces 3.3.3 Final。我无法对这些库进行任何升级,因为这是一个更大项目的一部分,但很高兴知道 JSF 2 或 Richfaces 4 是否支持它。
  • JSF 2 与 PrimeFaces 你可以肯定地做到这一点,因为 Datatable 绑定到两个列表,主列表和过滤列表,所以过滤列表始终在你的支持 bean 中可用。 PF 1.2 和rich 3.3 我想我做了类似的事情,我会看看。

标签: jsf richfaces richdatatable


【解决方案1】:

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

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

绑定属性将是HTMLExtendedDataTable 类型。之后,当用户在过滤器中键入内容时,您将需要创建一个 Ajax 调用,以进行调用。请参阅&lt;a4j:support /&gt; 组件并在按下某个键时使用它,如:

&lt;a4j:support event="onkeyup" reRender="countBox" action="#{sessionScope.paymentsBean.actionCalculateTotalValue}"/&gt;

记住在过滤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;
}

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

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    • 2017-06-05
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多