在DataTable中筛选包含日期的列

6

我有一个数据表格中的列,我想使用以下代码添加一个过滤器:

<p:dataTable id="aDataTable" var="aVariable" value="#{aView.values}" paginator="true" rows="10" selectionMode="single" selection="#{aView.selection}" onRowSelectUpdate="aForm">
                 <f:facet name="header">
                     A List
                 </f:facet>
              <p:column sortBy="#{aVariable.id}" filterBy="#{aVariable.id}" filterEvent="change">
                  <f:facet name="header">
                      <h:outputText value="No"/>
                  </f:facet>
                   <h:outputText value="#{aVariable.id}"/>
              </p:column>
              <p:column sortBy="#{aVariable.date}" filterBy="#{aVariable.date}" filterEvent="change">
                  <f:facet name="header">
                      <h:outputText value="Date"/>
                  </f:facet>
</p:dataTable>

日期以以下格式在表单中输入:
<h:outputText value="Date: *"/>
<p:calendar pattern="dd/MM/yyyy" value="#{aView.value.date}"/>

筛选功能对id可行,但对日期不起作用。原因是什么,如何使筛选器在这种情况下正常工作?

2个回答

11

目前PrimeFaces中还没有现成的日期过滤器机制,但是可以通过自定义过滤器来按日期进行过滤。您需要为列定义一个标题 facet,并使用ajax调用进行“手动”过滤,但这确实有效:

<column>
  <f:facet name="header">DateRange
    <div>
      <p:calendar id="from" value="#{bean.from}" styleClass="calendarFilter">
        <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/>
      </p:calendar>
      <p:calendar id="to" value="#{bean.to}" styleClass="calendarFilter">
        <p:ajax event="dateSelect" listener="#{ctrlr.filterDates()}" update="dataTableId"/>
      </p:calendar>
    </div>
  </f:facet>

...


ctrlr.filterDates()是什么? - WiXXeY
@WiXXeY - 这应该是控制器 bean 中的一个方法,根据日历组件中的值过滤日期。它没有提供,需要自行实现。 - kostja

7

为了更简单的解决方案,您只需要为“filterBy”组件使用String数据类型添加一个日期占位符。

步骤:

在模型类中创建一个新的瞬态属性。

@Transient
private String dateForFilter;
public String getDateForFilter() {
 return dateForFilter;
}
public void setDateForFilter(String dateForFilter) {
 this.dateForFilter = dateForFilter;
}

在返回数据模型之前,请创建以下逻辑。
public List<Item> getDataModel() {
   List<Item> lstItem = serviceClass.loadItem(userid);
   for (Item item : lstItem) {
      DateFormat dateFormat = null;
      Date date = item.getDate;
      dateFormat = new SimpleDateFormat("MM/dd/yyyy kk:mm");
      item.setDateForFilter(dateFormat.format(date));
   }

   return lstItem;
}

将您的XHTML更新以使用dateForFilter属性。

<p:column filterBy="#{item.dateForFilter}">
  <f:facet name="header">
    Transaction Date
  </f:facet>
  <h:outputText value="#{item.dateForFilter}" />
</p:column>

注意:仅当您不使用日期更新模型类的内容时才可以使用此功能。
希望对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接