2012-04-10 72 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

相關問題