Visualforce页面分页的方法1(使用StandardSetController来进行分页)【不推荐】
2023年09月06日
文章浏览:313
需求:在Visualforce内进行页面分页

这样的需求很常见,所以在Visualforce内进行页面分页,我们在这里简单地说明一下。

希望对大家有所帮助。


实现步骤(1):创建Apex代码

使用StandardSetController来进行分页,我们可以直接用StandardSetController内置的方法,比如如下方法。


  • standardSetCtrl.first()
  • standardSetCtrl.last()
  • standardSetCtrl.previous()
  • standardSetCtrl.next()
  • standardSetCtrl.getHasPrevious()
  • standardSetCtrl.getHasNext()
  • standardSetCtrl.getPageNumber()



详细我们可以参照官方的链接文章。

 https://developer.salesforce.com/docs/atlas.ja-jp.pages.meta/pages/apex_ApexPages_StandardSetController_methods.htm 




/**
 * @description       : 使用StandardSetController来进行分页
 * @author            : SalesforceGogogo.com
 * @last modified on  : 2023/08/31
 * @last modified by  : SalesforceGogogo.com
**/


public with sharing class BadPaging {
    // 検索結果件数
    public Integer searchCount { get; set; }
    public Integer viewrecCount { get; set; }
    
    // 検索リードリスト
    public List<Lead> searchLeadList { get; set; }      
    
    // 次ページ、前ページ用項目
    // ページング用StandardSetController
    public ApexPages.StandardSetController ssController{get; set;}  
    public Integer pagescroll { get; set; }             // ユーザに保存したScroll情報
    public Integer lastViewCallListPage { get; set; }   // ユーザが最後に見たページ数
    public String lastViewCallList { get; set; }        // ユーザが最後に見たコールリスト
    private static final Integer PAGE_SIZE =50 ;     // 1ページあたりの表示件数
    // ページング情報
    public Integer currentPage {get; private set;}          // 現在選択中のページ
    public Integer totalPage {get; private set;}            // ページ数
    public Integer intSearchLeadListSize { get; set; }          // 検索リードリストのサイズ
    public Integer intmyLeadListSize { get; set; }              // 表示中のリストのサイズ
    public Integer firstNum { 
        get{
            if(currentPage != null){
                return PAGE_SIZE * (currentPage - 1) + 1;
            }
            
            return 0;
        }
        set;
    }
    
    //-----------------------------------------
    // コンストラクタ
    //-----------------------------------------
    public BadPaging(){
    	searchWithPagnation();
    }
    
    public void searchWithPagnation(){
        this.searchCount = 0;
        
        String leadViewQuery = 
           'Select                            ' + 
           '    Id                            ' + 
           '    ,Name                         ' + 
           '    ,Phone                        ' + 
           '    ,MobilePhone                  ' + 
           '    ,State                        ' + 
           '    ,City                         ' + 
           '    ,Street                       ' + 
           '    ,CreatedDate                  ' + 
           '    ,FirstName                    ' + 
           '    ,LastName                     ' + 
           '    ,Company                      ' + 
           '    ,ConvertedAccountId           ' +
           'From                              ' + 
           '    Lead                          ' + 
           'Where                             ' + 
           '    IsDeleted = false             ' ;
           
        String leadCntQuery = 
           'Select                            ' + 
           '    Count(Id) cnt                 ' + 
           'From                              ' + 
           '    Lead                          ' + 
           'Where                             ' + 
           '    IsDeleted = false             ' ;
        
    	// 関連データからの条件絞り込みを実行する必要がある場合は関連データから検索を行う
    	String whereStr = '';
    	leadViewQuery = leadViewQuery + 'LIMIT 10000';
    	System.debug('■leadViewQuery---------------->'+ leadViewQuery);
    	
    	//List<Lead> searchLeadListQuery = Database.query(leadViewQuery);
    	//System.debug('■searchLeadListQuery---------------->'+ searchLeadListQuery);
    	
    	this.searchLeadList = Database.query(leadViewQuery);
    	this.intSearchLeadListSize = this.searchLeadList.Size();
    	System.debug('■searchLeadList.Size()---------------->'+ this.searchLeadList.Size());
    	
    	
    	leadCntQuery = leadCntQuery + whereStr;
        AggregateResult[] groupedResults = Database.query(leadCntQuery);
        
        // 検索結果件数を保持
        this.searchCount = Integer.valueOf(groupedResults.get(0).get('cnt'));
        //System.debug('■searchCount---------------->'+ searchCount);
    	
    	if(this.searchCount >= 50){
            this.viewrecCount = 50;
        }else{
            this.viewrecCount = this.searchCount;
        }
        
        changePage();
    }
    
    //-----------------------------
    // 改ページ設定初期化
    //-----------------------------
    public PageReference changePage() {
        System.debug('改ページ設定変更');
        ssController = new ApexPages.StandardSetController(this.searchLeadList);
        ssController.setPageSize(PAGE_SIZE);            
        
        // ページの総数を計算
        // レコード数 / ページサイズで計算、小数部分は切り上げ
        totalPage = (Integer)Math.ceil((Decimal)ssController.getResultSize() / PAGE_SIZE);
        System.debug('■totalPage---------------->'+ totalPage);
        
        
        //System.debug('保存されたコールリスト名:'+ this.lastViewCallList);
        
        // 現在のページ番号を取得
        if(
            this.lastViewCallListPage > 1 
            && this.lastViewCallListPage < = totalPage){
            currentPage = this.lastViewCallListPage;
            ssController.setpageNumber(currentPage);
        } else {
            currentPage = ssController.getPageNumber();
        }

        
        this.searchLeadList = getSearchLeadList();  
        System.debug('■searchLeadList.size()---------------->'+ this.searchLeadList.size());
        
        return null;
    }
    
    //---------------------------------------
    // 前へボタンが有効か
    //---------------------------------------
    public Boolean getEnablePrev(){
        
        System.debug('■ssController---------------->'+ ssController);
        if(ssController != null){
            System.debug('■ssController.getHasPrevious()---------------->');
            
            //List<Lead> myLeadList = (List<Lead>)ssController.getRecords();
            //System.debug('■myLeadList---------------->'+ myLeadList.size());
        
        
            return ssController.getHasPrevious();
        }else{
            System.debug('■getEnablePrev()---------------->null');
            return null;
        }
    }
    
    //---------------------------------------
    // 次へボタンが有効か
    //---------------------------------------
    public Boolean getEnableNext(){
        if(ssController != null){
            return ssController.getHasNext();
        }else{
            return null;
        }
    }
    
    //---------------------------------------
    // 次へボタンクリックアクション
    //---------------------------------------
    public void next() {
        ssController.next();
        currentPage = ssController.getPageNumber();
        
        this.searchLeadList = getSearchLeadList();  
    }
    
    //---------------------------------------
    // 前へボタンクリックアクション
    //---------------------------------------
    public void previous() {
        ssController.previous();    
        currentPage = ssController.getPageNumber();
        
        this.searchLeadList = getSearchLeadList();
    }
    
    
    //---------------------------------------
    // 現ページのレコードを取得する
    //---------------------------------------
    public List<Lead> getSearchLeadList(){
        System.debug('現ページのレコードを取得する');
        
        List<Lead> myLeadList = (List<Lead>)ssController.getRecords();
        System.debug('■myLeadList---------------->'+ myLeadList.size());
        
        intmyLeadListSize = myLeadList.size();
        
        
        return (List<Lead>)ssController.getRecords();
    }
}



实现步骤(2):创建Visualforce Page代码


<apex:page standardStylesheets="false" controller="BadPaging" lightningStylesheets="false" sidebar="false" showHeader="false" docType="html-5.0" id="page">
  <style>
    .table .thead-dark th {
        color: #000;
        background-color: #e9dfe5;
        border-color: #dee2e6;
    }
  </style>
<apex:form >
<table id="searchTable" class="table table-bordered table-striped" style="width:100%;height:1000px;table-layout: auto;">
<thead>
  <tr>
    <th colspan="10" style="border-bottom: solid 0.1px #e9dfe5;height:45px;" class="sorter-false filter-false" >
      <div style="width:50%;float:left;">検索結果:{!searchCount}件 表示件数:{!viewrecCount}件</div>
      <div style="width:50%;float:left;text-align: right;">
        <!-- ページネーション -->
        <apex:outputPanel layout="none" rendered="{!enablePrev}">
          <apex:commandLink value="< 前" action="{!previous}" />
          <apex:outputLabel value=" | " />
        </apex:outputPanel>
        <apex:outputLabel value="{!currentPage}/{!totalPage}" />
        <apex:outputPanel layout="none" rendered="{!enableNext}">
          <apex:outputLabel value=" | " />
          <apex:commandLink value="次 >" action="{!next}" />
        </apex:outputPanel>  
      </div>
    </th>
  </tr>
  <tr class="thead-dark">
      <th  width="3%"><span>No.</span></th>  
      <th  width="10%"><span>登録日</span></th>
      <th width="22%"><span>住所</span></th>
      <th width="15%"><span>顧客名</span></th>
      <th width="10%"><span>携帯</span></th>
      <th width="10%"><span>日時</span></th>
  </tr>
</thead>


<apex:variable var="rowNum" value="{!firstNum}" />
<apex:repeat value="{!searchLeadList}" var="scLead" >
  <tr class="dataLineNomal" style="height:45px;" id="{!scLead.Id}">
    <td style="font-size:12px;">
      <apex:outputText value="{!rowNum}"/>
    </td>
    <td style="font-size:12px;"><apex:outputField value="{!scLead.CreatedDate}"/></td>
    <td style="font-size:12px;padding:10px 10px 0px 10px;">
      <div><apex:outputText value="{!scLead.State}" /></div>
      <div><apex:outputText value="{!scLead.City}" /></div>
      <div><apex:outputText value="{!scLead.Street}" /></div>
    </td>
    <td style="font-size:12px;padding:10px 10px 0px 10px;">
      <div><div class="mapTColumnHeader">姓</div><apex:outputLink value="/{!scLead.Id}">{!scLead.FirstName}</apex:outputLink></div>
      <div><div class="mapTColumnHeader">名</div><apex:outputLink value="/{!scLead.Id}">{!scLead.LastName}</apex:outputLink></div>
    </td>
    <td style="font-size:12px;padding:10px 10px 0px 10px;">
      <div><div class="mapTColumnHeader">携帯</div><apex:outputText value="{!scLead.MobilePhone}"/></div>
    </td>
    <apex:variable var="rowNum" value="{!rowNum+1}"/>
  </tr>
</apex:repeat>
</table>
</apex:form>
</apex:page>


下面的文章,也是同样的方法,E文优秀的同学可以直接看E文。

 https://www.linkedin.com/pulse/visualforce-pagination-standardsetcontroller-madhura-priyadarshana/ 


实现效果

分页是能够实现,但有很大的缺陷。

【隐忧】大家可以看ViewState的状态,如果我要显示的数据量大,比如5000件,那么这个ViewState就要超过极限值了。

虽然现在VisualfocePage可能用到的比较少,仅供参考。



关注 收藏