0

MyFaces を使用して、ページ分割された並べ替え可能なデータテーブルを作成しようとしています。並べ替えは正常に機能します。列ヘッダーをクリックすると、列に基づいてデータが並べ替えられます。また、ページネーションはほとんどの場合うまく機能します。データテーブルは、ページごとにいくつかのアイテムで適切に分割されます。さらに、ユーザーがページごとに表示されるアイテムの数を変更できるようにしたいと考えています。繰り返しますが、これはすべてのアイテムを 1 ページに表示するまで機能しているようです。

このリファレンス(こちらも参照) によると、 t:datatableの「rows」属性を「0」に設定すると、テーブルの残りの行が表示されます。ただし、これを試すと、次のメッセージを含む例外が発生します。

javax.faces.FacesException - You need to set a value to the 'rows' attribute of component 'myComponent'

バッキング Bean の属性を使用して、ページあたりのアイテム数を設定しようとしています。私のt:datatableは次のようになります。

<t:dataTable id="myComponent" var="cur"
    value="#{backingBean.list}" sortAscending="#{backingBean.ascending}"
    sortColumn="#{backingBean.sortColumn}" sortable="true"
    styleClass="myClass" rowClasses="oddRow,evenRow"
    rows="#{backingBean.itemsPerPage}" preserveDataModel="false">
    <!-- data here -->
</t:datatable>

後で、ページネーションを制御するt:dataScrollerがあります。

<t:dataScroller id="pageNavigation" for="myComponent"
    paginatorActiveColumnStyle="font-weight:bold;"
    renderFacetsIfSinglePage="false" 
    binding="#{backingBean.scroller}" 
    paginator="true" >
    <!-- facets here -->
</t:dataScroller>

次に、ページごとのアイテム数を選択するh:selectOneMenuがあります。

<h:selectOneMenu id="myScroller"
    value="#{backingBean.itemsPerPage}"
    required="true" onchange="this.form.submit();"
    valueChangeListener="#{backingBean.updateItemsPerPage}">
    <f:selectItems value="#{backingBean.itemsPerPageArray}" />
</h:selectOneMenu>

私のバッキング Bean は次のようになります。

public class BackingBean {

    private boolean ascending;
    private Long itemsPerPage;
    private String sortColumn;
    private ArrayList<SelectItem> itemsPerPageArray;
    private ArrayList<SomeObject> list;  // data for table
    private HtmlDataScroller scroller;

    // constructors, getters, setters, and other stuff here

    public void updateItemsPerPage(ValueChangeEvent valueChangeEvent) {
        itemsPerPage = (Long) valueChangeEvent.getNewValue();
        resetScrollerIndex();
    }

    private void resetScrollerIndex() {
        if (scroller!=null && scroller.isPaginator())
            scroller.getUIData().setFirst(0);
    }

    // called in constructor
    private void constructItemsPerPageArray() {
        itemsPerPageArray = new ArrayList<SelectItem>();
        itemsPerPageArray.add(new SelectItem(new Long(10), "10"));
        itemsPerPageArray.add(new SelectItem(new Long(50), "50"));
        itemsPerPageArray.add(new SelectItem(new Long(100), "100"));
        itemsPerPageArray.add(new SelectItem(new Long(0), "All"));
    }
}

要約すると、 h:selectOneMenuから「すべて」の項目を選択すると、上記の例外が発生します。うまくいけば、適切なレベルの詳細が含まれています。ありがとう!

4

1 に答える 1

0

わかりました、私は答えを見つけたと思います...

updateItemsPerPage メソッドから最初の行を削除すると、問題は修正されます。メソッドは次のようになります。

public void updateItemsPerPage(ValueChangeEvent valueChangeEvent) {
    resetScrollerIndex();
}

それは私がそれを試みたと思った...

于 2011-03-24T15:33:30.573 に答える