1

我正在尝试以编程方式将该sortBy属性放入 primefaces 数据表中ColumngetColumns()我从 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

1 回答 1

4

ValueExpression如果未指定列,则forsortBy不会存储在任何地方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- 它会减少麻烦并且大部分时间都可以工作。

希望它有所帮助!

于 2012-04-10T16:14:22.627 回答