需求:在Visualforce内进行页面分页
这样的需求很常见,所以在Visualforce内进行页面分页,我们在这里简单地说明一下。
希望对大家有所帮助。
实现步骤(1):创建Apex代码
使用StandardSetController来进行分页,我们可以直接用StandardSetController内置的方法,比如如下方法。
详细我们可以参照官方的链接文章。
/**
* @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可能用到的比较少,仅供参考。