我正在尝试以编程方式将sortBy
属性放入primefaces数据表Column
。我继承了DataTable,并使用自定义getColumns()
调用创建了自己的列。
不幸的是,似乎没有将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。任何提示都赞赏。
答案 0 :(得分:4)
ValueExpression
,则sortBy
的{{1}}不存储在任何位置,这是您的情况。您必须为每个应该可排序的列创建自己的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());
现在你可以设置sortBy:
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);
请注意使用column.setValueExpression("sortBy", valueExpression);
代替column.setValueExpression
- 它可以减少麻烦并且可以在大部分时间内完成工作。
希望它有所帮助!