What Is Wrapper Class & How To Use It In Salesforce | The Complete Guide
Well, everyone knows that there a lot of thing to learn in Salesforce development, Here is one basic topic I am going to explain with proper working code, most of the time people get requirements like same and you can achieve this easily by using Wrapper class in Salesforce:
Definition: Wrapper class is a Container class used to wrap or bind multiple objects in a single class and use all class functionality to show data on a single visual force page in the same table.
Don't forget to check out: Salesforce Ant Migration Tool - The Complete Guide
Scenario 1: Fetch Account records when the checkbox is selected true
Controller Class:
public class AccountSelectController {
public List<WrapAccount> wrapAccList{get;set;}
public List<Account> selectedAccounts{get;set;}
public AccountSelectController(){
if(wrapAccList== null){
wrapAccList= new List<WrapAccount>();
List<Account> acc=[select id,name,phone from Account];
for(Account a: acc){
wrapAccList.add(new WrapAccount(a));
}
}
system.debug('wrapAccList++'+wrapAccList);
}
public void processSelected(){
selectedAccounts= new List<Account>();
for(WrapAccount w:wrapAccList){
if (w.selected==true){
selectedAccounts.add(w.acc);
}
}
}
public class WrapAccount{
public Account acc{get;set;}
public Boolean selected{get;set;}
public WrapAccount(Account a){
this.acc=a;
this.selected=false;
}
}
}
Visualforce Page for controller:
<apex:page controller="AccountSelectController">
<apex:form >
<apex:pageBlock >
<apex:pageBlockButtons >
<apex:commandButton action="{!processSelected}" value="Open Selected Accounts" rerender="t2"/>
</apex:pageBlockButtons>
<apex:pageBlockSection title="CheckBox Selected Accounts">
<apex:pageBlockTable value="{!wrapAccList}" var="ac">
<apex:column >
<apex:inputCheckbox value="{!ac.selected}"/>
</apex:column>
<apex:column value="{!ac.acc.name}"/>
<apex:column value="{!ac.acc.Phone}"/>
<apex:column value="{!ac.acc.id}"/>
</apex:pageBlockTable>
<apex:pageBlockTable value="{!selectedAccounts}" var="sl" id="t2">
<apex:column value="{!sl.name}"/>
<apex:column value="{!sl.phone}"/>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Scenario 2: Display the all contacts records related with Account when checkbox of Account data is checked true
Here I am writing code for creating a list of accounts along with checkboxes when you will select the checkbox true of a particular account, it will show contact details in another table.
Controller Class:
public class AccountSelectContact{
public List<WrapAccount> wrapAccList{get;set;}
public List<Account> selectedAccounts{get;set;}
public List<Contact> requiredContacts{get;set;}
public List<Account> accList{get;set;}
public List<Contact> conList{get;set;}
public AccountSelectContact(){
requiredContacts = new List<Contact>();
if(wrapAccList== null){
wrapAccList= new List<WrapAccount>();
conList = new List<Contact>();
accList=[select id,name,(select id,name from contacts) from Account];
for(Account a: accList){
wrapAccList.add(new WrapAccount(a));
}
}
system.debug('wrapAccList++'+wrapAccList);
}
public void processSelected(){
requiredContacts = new List<Contact>();
if(wrapAccList !=null){
//wrapAccList= new List<WrapAccount>();
selectedAccounts= new List<Account>();
conList=[select id,name,AccountId from Contact where AccountId IN: accList];
System.debug(conList);
System.debug(wrapAccList.size());
for(WrapAccount w:wrapAccList){
if (w.selected==true){
selectedAccounts.add(w.acc);
}
}
for(Account acc : selectedAccounts){
for(Contact con : conList){
if(con.AccountId == acc.Id){
requiredContacts.add(con);
}
}
}
System.debug(selectedAccounts);
}
}
public class WrapAccount{
public Account acc{get;set;}
public Boolean selected{get;set;}
public WrapAccount(Account a){
this.acc=a;
this.selected=false;
}
}
}
Visualforce Page:
<apex:page controller="AccountSelectContact">
<apex:form >
<apex:pageBlock title="All Accounts">
<apex:pageBlockButtons >
<apex:commandButton action="{!processSelected}" value="Get Contacts" rerender="t2"/>
</apex:pageBlockButtons>
<apex:pageBlockSection >
<apex:pageBlockTable value="{!wrapAccList}" var="ac">
<apex:column >
<apex:inputCheckbox value="{!ac.selected}"/>
</apex:column>
<apex:column value="{!ac.acc.name}"/>
<apex:column value="{!ac.acc.id}"/>
</apex:pageBlockTable>
<apex:pageBlockTable value="{!requiredContacts}" var="sl" id="t2">
<apex:column value="{!sl.name}"/>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageBlock>
</apex:form>
</apex:page>
Check out another amazing blog by Manish here: Landing Page Login Form And Save Data In Salesforce Data Extensions
Below image is showing how the scenario looks like: