function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
dmanidmani 

view state error with Wrapper Class

Hi everyone,

we have developed a VF page to add campaign members from one campaign to another campaign. we have designed two paegs for this. we are getting a View State error in second page since the query fetched more than 2500 records. We are facing view state error for Wrapper list namely  'camMemListFinal '

Class:

public with sharing class addCampaignmember {

    transient private List<CampaignMember> camMem = new List<CampaignMember>();
    transient private List<CampMembWrapper> camMemListFinal {get;set;}
    Public String Currentid {get;set;}
    Public String StatusId {get;set;}
    Public String RadioButId {get;set;}
    Public String cmdId {get;set;}
    Public Set<Id> campaignMemb = new Set<Id>(); 
    public List<Contact> conToAdd = new List<Contact>();
    public List<CampaignMember> camMemToAdd = new List<CampaignMember>();
    public List<CampaignMember> finalCMList = new List<CampaignMember>();
    public List<CampaignMember> preExistCMList = new List<CampaignMember>();
    public Set<Id> campSet = new Set<Id>();
    transient private List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
    public Integer camsize;
    
    //pagination
    public List<CampMembWrapper> PageList = new List<CampMembWrapper>();
    transient public List<CampMembWrapper> ResultList  = new List<CampMembWrapper>();
    
    private Integer pageNumber;
    private Integer pageSize;
    private Integer totalPageNumber;
    
    public addCampaignmember (ApexPages.StandardController controller) 
    {
    
    
        Currentid = ApexPages.CurrentPage().getParameters().get('CId');
        preExistCMList = [Select Id, ContactId from CampaignMember where CampaignId =: Currentid];
       
       
       
        for(Integer i=0; i<preExistCMList.size(); i++)
        {
            campSet.add(preExistCMList[i].ContactId);
        }
        
        
        camMem = [SELECT ContactId, 
                         Contact.Name, 
                         Contact.AccountId,
                         Id,Contact.Email,Contact.Phone,
                         Status,
                         CampaignId 
                         From CampaignMember  
                         WHERE CampaignId =:ApexPages.CurrentPage().getParameters().get('CmId')
                         and ContactId Not In: campSet];
                         
         cmdId =  ApexPages.CurrentPage().getParameters().get('CmId');   
         StatusId = ApexPages.CurrentPage().getParameters().get('StId');
         RadioButId = ApexPages.CurrentPage().getParameters().get('RbId');
        
        //pagination 
        pageNumber = 0;
        totalPageNumber = 0;
        pageSize = 15;
        viewData(); 
         
    }
    
    public List<CampMembWrapper> getcamMemList()
    {
      //  List<CampMembWrapper> camMemList = new List<CampMembWrapper>();
        
        
         
                                         
        for(CampaignMember campMemb : camMem)
        {
            CampMembWrapper cm = new CampMembWrapper(campMemb);
           
            cm.Selected = true;
            camMemList.add(cm);
        }  
        
        camMemListFinal = camMemList;
        return camMemList;
    }
    
    public pageReference addCampMembers()
    {
        
        
        
        camsize = camMemListFinal.size();
         system.debug('xxxx'+camsize);*/
         
        for(integer i=0; i<camMemListFinal.size(); i++)
        {
            system.debug('ggdhghushj' + camMemListFinal[i].selected);
            if(camMemListFinal[i].selected == True)
            {
                //camMemListFinal[i].campMem.Status =  StatusId;
                //camMemListFinal[i].campMem.CampaignId = Currentid;      
                campaignMemb.add(camMemListFinal[i].campMem.ContactId);
            }
        }
        // This part of code fetches the contact records which are in Active state 

        conToAdd = [Select Id, Name from Contact where Id In: campaignMemb and Active__c = true];
        
        for(Integer i=0; i<conToAdd.size(); i++)
        {
            camMemToAdd.add(new CampaignMember(ContactId=conToAdd[i].Id,CampaignId=CurrentId,Status=StatusId));
        }
        
        
        if(CamMemToAdd != null)
        {
            Database.SaveResult[] SaveResult_campMember = Database.Insert(camMemToAdd);
        }
                
        if(RadioButId == 'Override the member status')
        {
            finalCMList = [Select Id, CampaignId, Status from CampaignMember where CampaignId =: Currentid];
            for(Integer i=0; i<finalCMList.size(); i++)
            {
                if(finalCMList[i].Status != StatusId)
                {
                    finalCMList[i].Status = StatusId;
                }
            }
            update finalCMList;
        }

        PageReference firstPage = new PageReference('/'+Currentid);
        firstPage.setRedirect(true);
        return firstPage;
    }
    
    public pageReference goBack()
    {
        PageReference selectCampPage = new PageReference('/apex/addCampaignMembers?Id=' + CurrentId);  
        selectCampPage.setRedirect(true);
        return selectCampPage;
    }  

    public class CampMembWrapper 
    {
        public CampaignMember campMem         { get; set; }
        public boolean Selected     { get; set; }
        CampMembWrapper(CampaignMember c)
        {
            this.campMem = c;
        }
    }
    
   //Pagination
   
   public List<CampMembWrapper> getResultList()
    {
        return PageList;
    }
   
   public Integer getPageNumber()
    {
        return pageNumber; 
    }

     public Integer getPageSize()
    {
        return pageSize;
    }
    
    public Boolean getPreviousButtonEnabled()
    {
        return !(pageNumber > 1);
    }
    
     public Boolean getNextButtonDisabled()
    {
        if (ResultList == null) return true;
        else
                return ((pageNumber * pageSize) >= ResultList.size());
    }
    
    public Integer getTotalPageNumber()
    {
         system.debug('xxxYYY'+camsize);
        if (totalPageNumber == 0 && ResultList !=null)
        {
            totalPageNumber = camMemListFinal.size() / pageSize;
            Integer mod = camMemListFinal.size() - (totalPageNumber * pageSize);
            if (mod > 0)
            totalPageNumber++;
        }


        return totalPageNumber;
    }
    
     
     
     public PageReference ViewData()
    { 
        ResultList = getcamMemList();
        totalPageNumber = 0;
        BindData(1);
        return null;
    }
    
     public void BindData(Integer newPageIndex)
    {
        try
        {
            PageList = new List<CampMembWrapper>();
            
            system.debug('*****************'+ ResultList);
            Transient Integer counter = 0;
            Transient Integer min = 0;
            Transient Integer max = 0;
    
            if (newPageIndex > pageNumber)
            {
                min = pageNumber * pageSize;
                max = newPageIndex * pageSize;
            }
            else
            {
                max = newPageIndex * pageSize;
                min = max - pageSize;
             
            }
    
            for(CampMembWrapper a : ResultList)
            {
                counter++;
                if (counter > min && counter <= max) 
                        PageList.add(a);
            }
    
            pageNumber = newPageIndex;
    
            if (PageList == null || PageList.size() <= 0)
                    ApexPages.addmessage(new ApexPages.message(ApexPages.severity.INFO,'Data not available for this view.'));
    
        }
        catch(Exception ex)
        {
            ApexPages.addmessage(new ApexPages.message(ApexPages.severity.FATAL,ex.getMessage()));
        }
    
    }
    
    public PageReference nextBtnClick() 
    {
        BindData(pageNumber + 1);
        return null;
    }
    
    public PageReference previousBtnClick() 
    {
        BindData(pageNumber - 1);
        return null;
    }
     
   
}

VF page : 

<apex:page standardController="Campaign" id="addcampaign" extensions="addCampaignmember" readonly="true">
    <script>
        function CheckUncheckFacet(obj)
        {      
            document.getElementById('addContact:form1:block1:listUsers:datatableId:selectall').checked = false;               
            if(obj.checked)
                intSelectedItemsCount = intSelectedItemsCount + 1;
            else
                intSelectedItemsCount = intSelectedItemsCount - 1;
        }
        function selectChecked(form,value)
        {   
            var i = 0;
            for (i = 0; i < form.elements.length; i++) {
               
                if (form.elements[i].name.search('selected') > 0)
                    (document.getElementById(form.elements[i].name)).checked = value;
                /*if (form.elements[i].name.search('selected') > 0 && form.elements[i].disabled == false) {
                    if (form.elements[i].checked != value){
                        if (value)
                            intSelectedItemsCount = intSelectedItemsCount + 1;
                        else
                            intSelectedItemsCount = intSelectedItemsCount - 1;
                    }                                               
                    form.elements[i].checked = value;
                }*/
            }
        }
        function selectAllOrNoneByCheckbox(form,control)
        {   
           selectChecked(form, control.checked); 
        }
        function closeWindow()
        {
            top.window.close();
            parent.window.opener.location.reload();
        }
        
        function baktoCamp(campId) {
    
            top.window.opener.location.href="/"+campId;
        }    
    </script>
    <apex:sectionHeader title="Campaign" subtitle="Add Members" />
    
    <apex:form id="form1">
        <apex:pageBlock id="pageBlock">
            <apex:pageBlockSection Title="Step 2. Select Campaign Members to be Added" id="listUsers" columns="1">
                <apex:PageBlockTable value="{!ResultList}" var="c" border="1" id="datatableId">
                    <apex:column >
                        <apex:facet name="header" >
                            <apex:inputCheckbox id="selectall" onclick="javascript:selectAllOrNoneByCheckbox(document.forms['addcampaign:form1'], this);" selected="true"/>
                        </apex:facet>
                        <apex:inputCheckbox value="{!c.selected}" onclick="javascript:CheckUncheckFacet(this)"  id="selected" />   
                    </apex:column>
                    <apex:column headervalue="Name" value="{!c.campMem.Contact.Name}" />
                    <apex:column headervalue="Account Location      " value="{!c.campMem.Contact.AccountId}" /> 
                    <apex:column headervalue="Status" value="{!c.campMem.status}" />                    
                    <!--  <apex:column headervalue="Campaign" value="{!c.campMem.Campaign.Name}" />-->
                    <apex:column headervalue="Phone Number" value="{!c.campMem.Contact.Phone}" />
                    <apex:column headervalue="E-mail" value="{!c.campMem.Contact.Email}" />
                </apex:PageBlockTable>
            </apex:pageBlockSection>  
            <br/>
            <div align="right">
                <br/>
                <font size="1pt">Page #:&nbsp;<apex:outputLabel value="{!PageNumber}"/>&nbsp;out of&nbsp;<apex:outputLabel value="{!totalPageNumber}"/>&nbsp;&nbsp;&nbsp;&nbsp;</font>
                <apex:commandButton value="Previous" action="{!previousBtnClick}" disabled="{!previousButtonEnabled}" reRender="pageBlock"></apex:commandButton>
                <apex:commandButton value="Next" action="{!nextBtnClick}" reRender="pageBlock" disabled="{!nextButtonDisabled}"></apex:commandButton>
            </div>
            <br/>
            <br/>
        
            <table width="500px">
                <tr>
                    <td align="right">
                    <apex:commandButton value="Add Members" action="{!addCampMembers}" 
                            onComplete="baktoCamp('{!Currentid}'); closeWindow();" />
                    <apex:commandButton value="Back" action="{!goBack}"/>
                    </td>
                </tr>
            </table>
        </apex:pageBlock>  
    </apex:form>
    <script>
        function backToCampaign(campId) 
        {
            top.window.opener.location.href="/"+campId;
        }    
    </script>
</apex:page>


Could anyone suggest a solution to solve this view state issue. I have tried with Transient Keyword. But the wrapper class list gives null point exception since i am using transient .

Tried with StandardsetController to fetch the records , but Standard set controller is not supported for Campaign Members Object.
 Please suggest a Solution ASAP. Any help is much appreciated. 
SonamSonam (Salesforce Developers) 
Go through the following threads, might give you a workaround to your view state issue:
https://developer.salesforce.com/forums/ForumsMain?id=906F000000099GbIAI
http://salesforce.stackexchange.com/questions/4537/how-to-reduce-a-large-internal-view-state-what-is-in-the-internal-view-state