分頁控制器
程式碼示例:現在開始建立分頁控制器
public with sharing class Pagination {
}
我將以分頁的形式顯示所有聯絡人,每個聯絡人應該有一個核取方塊來選擇或取消選擇聯絡人以對聯絡人執行刪除操作。所以我需要建立一個包裝類來儲存聯絡人和布林變數以供選擇。首先為控制器 Pagination 建立 Wrapper 類將下面的程式碼插入到分頁控制器中。
public class contactWrapper{
public Contact cont {get;set;}
public Boolean isSelected{get;set;}
public contactWrapper(contact c,Boolean s)
{
cont=c;
isSelected=s;
}
}
現在,在 StandardSetController 的幫助下,將 Apex 中的資料檢索到 Paginate。StandardSetController 是一個非常強大的工具,具有內建函式,可用於大大簡化 Visualforce 頁面中的自定義程式碼。由於伺服器僅返回所請求頁面的資料,因此 StandardSetController 可以顯著減少檢視狀態,尤其是與使用 SOQL 時獲得的檢視狀態相比。
Public Integer noOfRecords{get; set;} // Future reference in Visual force Page
Public Integer size{get;set;} // Future reference in Visual force Page
public final Integer Page_Size=10; // Number records in a Page should be displayed
public ApexPages.StandardSetController setCon {
get{
if(setCon == null){
size=Page_Size;
string queryString = 'Select Id,Name, Email, Birthdate, Phone, MobilePhone from Contact order by Name';
setCon = new ApexPages.StandardSetController(Database.getQueryLocator(queryString));
setCon.setPageSize(size);
noOfRecords = setCon.getResultSize();
}
return setCon;
}set;
}
現在你有了變數 setCon 中的聯絡人,每當你請求 setCon.getRecords()
時,它將從 setCon 中檢索前 10 個聯絡人記錄。在這裡,我建立了一個簡單的包裝類來向你展示演示。你可以根據需要建立自己的包裝類。但總是必須要注意 ApexPages.StandardSetController 只儲存 List 的 sObject,它不會儲存包裝類物件的列表。這就是我在下面編寫額外程式碼以不同方式完成這個未來的原因。下面的程式碼將聯絡人列表轉換為包裝類物件列表,這樣當你在 visual force page 中呼叫聯絡人時,它將收到包裝類物件的列表。
public list<contactWrapper> contWpr{get;set;}
public set<id> selectedContactIds{ get;private set;} // to maintain state of the selected contact
// through out paginating
public Pagination() {
selectedContactIds=new set<id>();
}
Public list<contactWrapper> getContacts(){
contWpr =new list<contactWrapper>();
for(Contact c: (List<Contact>)setCon.getRecords())
if(selectedContactIds.contains(c.id))
contWpr.add(new contactWrapper(c,true));
else
contWpr.add(new contactWrapper(c,false));
return contWpr;
}
現在你已經編寫了用於生成結果的程式碼但是如何在頁面中導航?這可以通過 ApexPages.StandardSetController.Look 在 StandardSetController 的下面的程式碼美容中輕鬆完成,無需維護頁碼,偏移和限制等。只需使用 StandardSetController 方法即可。將以下程式碼複製到分頁控制器。
public Boolean hasNext {
get {
return setCon.getHasNext();
}
set;
}
public Boolean hasPrevious {
get {
return setCon.getHasPrevious();
}
set;
}
public Integer pageNumber {
get {
return setCon.getPageNumber();
}
set;
}
public void first() {
setCon.first();
// do you operation here
}
public void last() {
setCon.last();
// do you operation here
}
public void previous() {
setCon.previous();
// do you operation here
}
public void next() {
setCon.next();
// do you operation here
}
你幾乎完成了 Paginating 聯絡人。我新增的最後幾個方法來實現我的整個頁面功能。正如我前面提到的,我們有額外的核取方塊來選擇聯絡人並對選定的聯絡人執行刪除操作
public void contactSelection()
{
Id id=(Id)ApexPages.currentPage().getParameters().get('cId');
if(selectedContactIds.contains(id))
selectedContactIds.remove(id);
else
selectedContactIds.add(id);
}
public void deleteContacts()
{
List<contact> contactToDelete=[select id from contact where id in :selectedContactIds];
if(contactToDelete.size()!=0) // if(!contactToDelete.isEmpty()) // Best Practice
{
try { delete contactToDelete; } // You may get Exception if you try to delete the
// related contact ,include try block to avoid error.
catch(exception ex){ System.debug(ex); }
refresh();
}
}
public pageReference refresh() {
setCon = null;
selectedContactIds=new set<id>();
getContacts();
setCon.setPageNumber(1);
return null;
}