0

I am need to remove a Contact record in the List on click of the commandLink. To remove the record I am calling the function below :

removeContacts

    /*Method to remove contacts*/
   public void removeContacts(){ 
   ID removeThis = ApexPages.currentPage().getParameters().get('selectID'); 
   List<Integer> deleteIndex = new List<Integer>();
   Integer I = 0;
   deleteIndex.clear();
   for(selectedRecord deleteRecord : selectedContactValues){    
       I++;  
       if(deleteRecord.thisContact.id == removeThis){
           deleteIndex.add(I);
           system.debug(removeThis+'..................This record is deleted');
       }
     }
   for(Integer index  : deleteIndex){
       selectedContactValues.remove(index);
     }
   }   

The Visualforce Page block is as below :

    <apex:outputText value="Selected Contacts"/>
    <apex:pageBlock id="selectedContactDetails">
        <apex:pageBlockTable value="{!selectedContactValues}" var="this">
             <apex:column headerValue="Select All">           
                   <apex:commandLink value="Remove" action="{!removeContacts}" rerender="selectedContactDetails">                           
                            <apex:param name="selectID" value="{!this.thisContact.ID}"/>                         
                   </apex:commandLink>
             </apex:column> 
             <apex:column headerValue="First Name" value="{!this.thisContact.FirstName}"/> 
             <apex:column headerValue="Last Name" value="{!this.thisContact.LastName}"/>      
             <apex:column headerValue="Email" value="{!this.thisContact.Email}"/>           
             <apex:column headerValue="Function" value="{!this.thisContact.Domain__c}"/> 
             <apex:column headerValue="City" value="{!this.thisContact.City__c}"/>                      
             <apex:column headerValue="Country" value="{!this.thisContact.Country__c}"/>                                 
        </apex:pageBlockTable>
    </apex:pageBlock>

The page is displaying the records on the page load initially. When I delete the first record also it does not give any error. But when I delete the second or any other record (except first record) it gives me the below error :

System.ListException: List index out of bounds: 1 Error is in expression '{!removeContacts}' in page wrapperdemo_con: Class.liveYourPotentialEmailer.removeContacts: line 80, column 1

or

System.ListException: List index out of bounds: 4 Error is in expression '{!removeContacts}' in page wrapperdemo_con: Class.liveYourPotentialEmailer.removeContacts: line 78, column 1

or

System.ListException: List index out of bounds: 6 Error is in expression '{!removeContacts}' in page wrapperdemo_con: Class.liveYourPotentialEmailer.removeContacts: line 78, column 1

Error is shown depending on the index of the record that I try to delete.

6

There is just a small logic issue with your code. you are updating variable I before IF statement(adding the index number to deleteIndex list), that results into setting incorrect index. the variable I should be incremented after adding the index number to deleteIndex list. try below code-

    /*Method to remove contacts*/
   public void removeContacts(){ 
   ID removeThis = ApexPages.currentPage().getParameters().get('selectID'); 
   List<Integer> deleteIndex = new List<Integer>();
   Integer I = 0;
   deleteIndex.clear();
   for(selectedRecord deleteRecord : selectedContactValues){    
       if(deleteRecord.thisContact.id == removeThis){
           deleteIndex.add(I);
           system.debug(removeThis+'..................This record is deleted');
       }
       I++;  
     }
   for(Integer index  : deleteIndex){
       selectedContactValues.remove(index);
     }
   }
  • Anup, could you also explain your answer ? Providing this info will help us all learn from this question a great deal more. – Samuel De Rycke Apr 3 '15 at 8:05
  • @SamuelDeRycke, Explanation added in answer. – Anup Apr 3 '15 at 17:34
0

You can try below :

Class

public void removeContacts(){ 
       Integer rowToRemove = Integer.ValueOf(ApexPages.currentPage().getParameters().get('rowToRemove')); 
       selectedContactValues.remove(rowToRemove);      
   }   

Page

        <apex:variable value="{!0}" var="rowNum"/> 
        <apex:pageBlockTable value="{!selectedContactValues}" var="this">
             <apex:column headerValue="Select All">           
                   <apex:commandLink value="Remove" action="{!removeContacts}" rerender="selectedContactDetails">                           
                            <apex:param value="{!rowNum}" name="rowToRemove" assignTo="{!rowToRemove}"/>                                                         
                   </apex:commandLink>
                   <apex:variable var="rowNum" value="{!rowNum + 1}"/>

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.