Datascroller和sortOrder on rich:extendedDataTable

时间:2011-09-08 12:53:07

标签: jsf datatable richfaces datascroller

我在Jsf页面上遇到了问题。 datascroller没有更改dataTable的分页,点击了一些页面(仍然保留在分页的第一页)。

  • Richfaces:3.3.2.SR1
  • Jsf:1.2
  • JBoss 5.0.1

此代码不会更改分页:

<rich:extendedDataTable id="tableDataTable" value="#{beanController.listTableDataModel}" 
    var="tableItem" selectionMode="single"
    rows="3" width="150px" height="100px" selection="#{beanController.tableSelection}">

    <rich:column sortBy="#{tableItem.code}" width="150px" label="#{msg.table}">
        <h:outputText value="#{tableItem.code}" />
    </rich:column>
    <rich:column sortBy="#{tableItem.code}" width="150px" label="#{msg.table}">
        <h:outputText value="#{tableItem.code}" />
    </rich:column>
</rich:extendedDataTable>
<rich:datascroller id="tableDataScroller" align="center" for="tableDataTable" renderIfSinglePage="false" />

我解决了定义sortOrder属性的问题。 这样可以正常工作(只有一个区别:列上的sortOrder="ASCENDING"):

<rich:extendedDataTable id="tableDataTable" value="#{beanController.listTableDataModel}" 
    var="tableItem" selectionMode="single"
    rows="3" width="150px" height="100px" selection="#{beanController.tableSelection}">

    <rich:column sortBy="#{tableItem.code}" width="150px" label="#{msg.table}" sortOrder="ASCENDING">
        <h:outputText value="#{tableItem.code}" />
    </rich:column>
    <rich:column sortBy="#{tableItem.code}" width="150px" label="#{msg.table}">
        <h:outputText value="#{tableItem.code}" />
    </rich:column>
</rich:extendedDataTable>
<rich:datascroller id="tableDataScroller" align="center" for="tableDataTable" renderIfSinglePage="false" />

问题是为什么我们必须使用datascroller定义sortOrder来纠正数据表分页? 有什么想法吗?

修改:DataProvider代码

public class BeanDataProvider implements DataProvider<Bean> {


    private static final long serialVersionUID = -3539248649798786324L;

    public BeanDataProvider() {
    }

    public BeanDataProvider(ArrayList<Bean> beans) {
        this.beans = beans;
    }

    private List<Bean> beans;


    public Bean getItemByKey(Object paramObject) {
        Bean resultat = null;
        for (Bean bean : this.getBeans()) {
            if (bean.getIdentifiant().equals(paramObject)) {
                resultat = bean;
                break;
            }
        }
        return resultat;
    }


    public List<Bean> getItemsByRange(int paramInt1, int paramInt2) {
        return this.getBeans().subList(paramInt1, paramInt2);
    }


    public Object getKey(Bean paramT) {
        return paramT.getIdentifiant();
    }


    public int getRowCount() {
        return this.getBeans().size();
    }


    public List<Bean> getBeans() {
        if (beans == null) {
            beans = new ArrayList<Bean>();
        }
        return beans;
    }


    public void setbeans(List<Bean> beans) {
        this.beans = beans;
    }

}

2 个答案:

答案 0 :(得分:1)

使用richfaces 3.3.3测试你的代码并且它工作正常。在两种情况下分页都可以改变。所以我认为sortOrder和datatable分页没有关系来影响彼此。

我发现release note of RichFaces - Version 3.3.3.BETA1rich:datascroller有一些错误修复。也许您可以在DEV环境中升级到richfaces 3.3.3以查看问题是否仍然存在。

答案 1 :(得分:1)

这是RichFaces中的一个错误:

  

TableSorting - Built-in - pages cannot be switched by DataScroller

     

在初始状态页面上点击编号页面(例如2)时   没有换过。

     

点击排序列后,表格重新渲染得很好   报头中。

升级到3.3.3.Final应该会有所帮助。

关于ExtendedTableDataModel

在3.3.3.Final(richfaces-impl-3.3.3.Final.jar中的org.richfaces.model.ExtendedTableDataModel)中可用。 它也可以在文档中找到:http://docs.jboss.org/richfaces/3.3.X/3.3.3.Final/en/apidoc_impl/(../apidoc_impl/用于richfaces-impl,.. / apidoc /用于richfaces-ui)。

RF4中。在RF4中探索这些类:

org.richfaces.model.ArrangeableState
org.ajax4jsf.model.ExtendedDataModel
org.richfaces.model.ArrangeableModel

<强>更新

使用ExtendedTableDataModifiableModel代替ExtendedTableDataModel

new ExtendedTableDataModifiableModel(dataProvider);

甚至更好(当列表用作数据源时):

new ListDataModel(list);