2011-07-15

Force.com : Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい


@途中
2011.07.25 追記



Visualforce ページのレコード一覧表示をした際に、ページング機能が欲しい



ここ ]見れば解決。



○ ページング機能が欲しい
Ex.
  • 表示されているページに対して前のページがある場合は[Prev]を表示して、前頁へ戻れるようにする
  • 表示されているページに対して次ぎのページがある場合は[Next]を表示して、次頁へ進めるようにする
  • ページの最大表示件数は 20 件とする
  • 表示されているページに全件数に対して何件目から何件目までのレコードが表示されているかを示す

■ Visualforce ページ
<apex:page standardController="Foo__c" extensions="FooPagination" tabStyle="Foo__c" action="{!view}">
    <apex:sectionHeader title="Foo" />
    <apex:pageBlock title="Viewing Foos" rendered="{!(dtos.size > 0)}">
        <apex:form id="theForm">
            <apex:pageBlockTable value="{!dtos}" var="d">
                <apex:column style="width:30px;text-align:center;">
                    <apex:facet name="header"><apex:outputText value="No." /></apex:facet>
                    <apex:outputText value="{!d.lineNo}" />
                </apex:column>                
                <apex:column style="width:120px">
                    <apex:facet name="header"><apex:outputText value="Name" /></apex:facet>
                    <apex:outputField value="{!d.foo.Name}" />
                </apex:column>                
            </apex:pageBlockTable>
            <apex:panelGrid columns="3">
                <apex:outputText value="{!page}" />
                <apex:commandLink action="{!first}" rendered="{!ssc.HasPrevious}" value="[First]" />
                <apex:commandLink action="{!previous}" rendered="{!ssc.HasPrevious}" value="[Prev]" />
                <apex:commandLink action="{!next}" rendered="{!ssc.HasNext}" value="[Next]" />
                <apex:commandLink action="{!last}" rendered="{!ssc.HasNext}" value="[Last]" />
            </apex:panelGrid>
        </apex:form> 
    </apex:pageBlock>
</apex:page>

■ FooPagination クラス
public with sharing class FooPagination {

    /**
     * 画面表示クラス
     */
    public class DTO {
        /** 行番号  */
        public Integer lineNo { get; set; }
        /** [Foo]オブジェクト */
        public Foo__c foo { get; set; }
        /**
         * コンストラクタ
         */
        public DTO() {
            lineNo = 0;
            foo = new Foo__c();
        }
    }

    /**
     * コンストラクタ
     * @param controller
     */
    public FooPagination(ApexPages.StandardController controller) {
        // レコード一覧の設定
        ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
        // 一頁最大表示件数の設定(default:20)
        ssc.setPageSize(20);
    }

    /** 画面一覧 */
    public List<DTO> dtos { get; set; }
    /** ページ情報 */
    public String page { get; set; }
    /** StandardSetController */
    public ApexPages.StandardSetController ssc { get; set; }

    /**
     * 表示
     */
    public void view() {
        Integer firstLineNo = ((ssc.getPageNumber() - 1) * ssc.getPageSize()) + 1;

        // ページ情報設定
        page = '';
        page += firstLineNo;
        page += ' - ';
        page += firstLineNo + ssc.getPageSize() - 1;
        page += ' / ';
        page += ssc.getResultSize();

        // 画面一覧設定
        dtos = new List<DTO>();
        List<Foo__c> fs = ssc.getRecords();
        for(Integer i=0; i<fs.size(); i++) {
            DTO d = new DTO();
            d.lineNo = (firstLineNo + i);
            d.foo = fs.get(i);
            dtos.add(d);
        }
    }
    /**
     * 最初のページへ
     */
    public void first() {
        ssc.first();
        view();
    }
    /**
     * 最後のページへ
     */
    public void last() {
        ssc.last();
        view();
    }
    /**
     * 次へ
     */
    public void next() {
        ssc.next();
        view();
    }
    /**
     * 前へ
     */
    public void previous() {
        ssc.previous();
        view();
    }
}



◆ メモ
public void previous() {
    try {
        ssc.previous();
    } catch (System.VisualforceException e) {
        System.debug(e);
        init(ssc.getPageNumber() - 2);
    }
    view();
}
private void init(Integer pageNumber) {
    ssc = new ApexPages.StandardSetController (Database.getQueryLocator([SELECT Id, Name FROM Foo__c ORDER BY Name]));
    for(Integer i=0; i<pageNumber; i++) {
        ssc.next();
    }
}



◆ メモ (注意)
  • 「このページは QueryLocator を使用しますが、これは無効です。QueryLocator はユーザあたり 5 個という制限があります。」のメッセージが表示される場合:
    Edit: This only happens after 15 minutes of idle usage. If after that point someone tries to call a method on the StandardSetController it throws an uncatchable exception.

    Community - Working around "This page uses a QueryLocator that... - Force.com Discussion Boards
    ... 15 分以上放置してページ遷移しようとしたら、catch できない例外が発生するらしい ;-(。



◆ StandardSetController クラス
@TODO



◇ 環境

  • Salesforce - Developer Edition - API バージョン 22.0



◇ 参考

0 件のコメント:

コメントを投稿