分页控制器
代码示例:现在开始创建分页控制器
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;
}