【问题标题】:How to set <p:column filterOptions> programmatically如何以编程方式设置 <p:column filterOptions>
【发布时间】:2013-11-29 01:30:48
【问题描述】:

使用 JSF 2.2 和 PrimeFaces 4.0。

基本上,我正在尝试以编程方式将选择选项(下拉列表)设置为&lt;p:dataTable&gt; 中的&lt;p:column&gt; 的过滤器。问题是当我使用下面的代码设置它时,它只呈现一个简单的输入文本,尽管它确实触发了客户端过滤操作。如何让下拉菜单显示?

填充选项列表的代码。

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);  

【问题讨论】:

  • 请问有人吗?我必须在问题文本中编辑一些内容吗?
  • 你不应该修复你的setFilterBy()setSortBy()吗? stackoverflow.com/questions/20000815/…
  • 我修复了它,我仍然无法使这个工作,@BalusC 你是我的导师,请帮助。
  • 这在现有资源的情况下是不可能的吗?

标签: jsf primefaces datatable dynamically-generated


【解决方案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&lt;SelectItem&gt;。创建一个应用程序范围的 bean 类 Data,将该列表作为属性,以便 #{data.filterOptions} 可以使用它,最后在它周围创建一个 ValueExpression 并将其设置为过滤器选项:

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

【讨论】:

  • 我试过一次:column.setValueExpression("setFilterOptions",filterexpress);但它现在不起作用我用“filteroptions”替换“setFilterOptions”并猜测它工作得很好,这很棒,谢谢BalusC。
【解决方案2】:

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

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

  public getFiltermode(){
      return "filtermode";
  }

}

【讨论】:

  • 你是如何实现这个的,为什么我不能像 XHTML 那样将 SelectedItem 的数组提供给 setFilterOptions() ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-13
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-01
相关资源
最近更新 更多