如何以编程方式设置<p:column filteroptions =“”> </p:column>

时间:2013-11-15 15:38:18

标签: jsf primefaces datatable dynamically-generated

使用JSF 2.2和PrimeFaces 4.0。

基本上,我尝试以编程方式将{select选项(下拉列表)设置为<p:column><p:dataTable>的过滤器。问题是当我使用下面的代码设置它时,它只呈现一个简单的输入文本,尽管它会触发客户端过滤操作。如何显示下拉列表?

填充选项列表的代码。

private SelectItem[] createFilterOptions() {

    List<SelectItem> options = new ArrayList<SelectItem>();

    options.add(new SelectItem("", "Tout"));
    options.add(new SelectItem(0, "Pas encore"));
    options.add(new SelectItem(1, "Patient en retard"));
    options.add(new SelectItem(2, "Patient arrivé"));
    options.add(new SelectItem(3, "Trop attendu"));
    options.add(new SelectItem(4, "Patient préparé"));
    options.add(new SelectItem(5, "Examen en cours"));
    options.add(new SelectItem(6, "Examen terminé"));
    options.add(new SelectItem(7, "Résultats remis"));
    options.add(new SelectItem(8, "Examen annulé"));

    return options;
}

这就是我设置列的filterOptions属性的值:

SelectItem[] etatExamOptions = createFilterOptions();
Column patSate = (Column) application.createComponent(Column.COMPONENT_TYPE);
patSate.setHeaderText("Etat");
patSate.setWidth("10");
patSate.setId("etatCol");
patSate.setFilterBy("examen.studyPatientState");
patSate.setFilterOptions(etatExamOptions);
patSate.setFilterMatchMode("exact");
patSate.setFilterStyle("dispo");
patSate.setSortBy("examen.studyPatientState");
patSate.setRendered(true);  

2 个答案:

答案 0 :(得分:1)

我在DataTableRenderer source code偷看。当filterOptions属性是值表达式时,它似乎只呈现为下拉列表。

468    if(column.getValueExpression("filterOptions") == null) {
...        // ...            
471        writer.startElement("input", null);
...        // ...            
490    }
491    else {
...        // ...            
494        writer.startElement("select", null);
...        // ...            
514    }

乍一看有些奇怪,但考虑到filterOptions在XHTML方面通常使用的方式,这是有道理的。他们本可以在这里做得更好,例如评估值instanceof并检查它是SelectItem的数组还是集合,但您必须使用已提供的内容。

您需要将其设置为引用bean属性而不是“硬编码”List<SelectItem>的值表达式。创建一个应用程序范围的bean类Data,将该列表作为属性,以便#{data.filterOptions}可以使用它,最后在它周围创建一个ValueExpression并将其设置为过滤器选项:

patSate.setFilterOptions(createValueExpression("#{data.filterOptions}", List.class));

答案 1 :(得分:-2)

您可以在bean中设置filteroption并将其从那里传递给xhtml

<p:datatable ... filtermode="#{bean.filtemode}"....
...
public class Bean{

  public getFiltermode(){
      return "filtermode";
  }

}