2012-04-10 83 views
1

我试图以编程方式将sortBy属性放入primefaces数据表Column中。我从DataTable继承,并使用自定义的getColumns()调用创建自己的列。以编程方式将sortBy属性添加到primefaces DataTable列

遗憾的是似乎有插入sortBy属性栏没有干净的方法,因为该方法却并不知道它是在上下文。

public List<Column> getColumns() { 
    if (columns == null) { 
     columns = new ArrayList<Column>(); 
     String[] columnStrings = getShowColumns().split(","); 
     for (String columnString : columnStrings) { 
      Column column = getColumnByType(columnString.trim()); 
      if (column != null) { 
       //here I have to add the sortBy Expression somehow, 
       //but there is no context to construct it from 
       //column.setSortBy(ValueExpression) 
       columns.add(column); 
      } 
     } 
    } 
    return columns; 
} 

它似乎很明显对我来说,我我错过了一些东西,但我现在迷失了。 Column似乎是填充ValueExpression别的地方,但我不知道在哪里...

我试图通过所有的代码使用调试器,但我不明白当ValueExpression是在原始实现中生成。任何提示赞赏。

回答

4

ValueExpression对于sortBy没有存储在任何地方,如果列没有指定sortBy,这是你的情况。您必须为每个可排序的列创建自己的ValueExpression

我假设你知道列的类型和价值,所以你可以试试这个:

Column column = getColumnByType(columnString.trim()); 
FacesContext facesContext = FacesContext.getCurrentInstance(); 
ELContext elContext = facesContext.getELContext(); 
ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory(); 
ValueExpression valueExpresion = elFactory.createValueExpression(elContext, column.getValue(), column.getType()); 

不然,如果你不知道的类型和值:

String valueExprs = "#{data.street}"; // for example 
    ... 
    Column column = getColumnByType(columnString.trim()); 
    ... 
    FacesContext facesContext = FacesContext.getCurrentInstance(); 
    ELContext elContext = facesContext.getELContext(); 
    ExpressionFactory elFactory = facesContext.getApplication().getExpressionFactory(); 
    ValueExpression valueExpression = elFactory.createValueExpression(elContext, valueExprs, String.class); 

现在你可以设置sortBy:

column.setValueExpression("sortBy", valueExpression); 

通知使用column.setValueExpression代替column.setSortBy - 它会导致更少的麻烦和大多数时间工作。

希望它有帮助!

+0

非常感谢。我不知道我可以在单身人士的背景下使其工作。我仍然没有得到什么时候以及为什么通过引用来传递语境,但这是另一个问题。再次感谢! – devsnd 2012-04-11 09:15:19

+0

不客气。你可以在任何jsf相关的“对象”(比如beans,phaseListeners等等)中抽取上下文。但是,你必须要求在单独的问题中得到更多有经验的用户和像BalusC这样的专业人员的详细答案。 – Fallup 2012-04-11 09:53:36

相关问题