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
Collen Mayer 6Collen Mayer 6 

Visual Force: Adding a row then cancelling

HI,
I'm trying to use the following code to add and delete records from a mileage report object.  Everything is working great, except if the user hits the add row button ("add expense") and then changes his mind and hits "delete" button, the row won't delete until user puts values in the required field of the row he's trying to delete.  Is there a way to simply cancel adding the row?  I'm just getting started with VF/Apex and trying to make the code work.  Any help is appreciated.  
<apex:page standardController="Expense_Report__c" extensions="addMileageExpense" sidebar="false">
 <table>
    <colgroup>
            <col span="2" /><col />
  	</colgroup>
  <tr>
    <td><h2>
        Expense Report Name:</h2></td>
      <td> <apex:outputField value="{! Expense_Report__c.Name__c }"/></td>  
  </tr>
  <tr></tr>
  <tr>
      <td><h2>
          
          Start Date:</h2> </td>
      <td><apex:outputField value="{! Expense_Report__c.Start_Date__c}"/></td>
  </tr>

    <br/>
    <br/>
            <td><h2>
          Expense Report:</h2> </td>
      
     <td><apex:outputField value="{!Expense_Report__c.id}"/>	</td>
</table>
        <br/>
    <br/>
    <apex:form >

 		<apex:pageBlock title="Mileage Report" id="er">
 		
            <apex:pageMessages />
 		<apex:variable var="rowNumber" value="{!0}"/>
               <apex:pageblockSection columns="1" id ="mytable">
                   <apex:actionSupport event="onchange" reRender="mytable"/>   
 				<apex:pageBlockTable title="Mileage Expenses" var="me" value="{!expenseList}"> 

 					<apex:column headerValue="Entry" style="width:20px; text-align:center;" headerClass="centertext">
 						<apex:outputText value="{0}" style="text-align:center;"> 
 							<apex:param value="{!rowNumber+1}" /> 
 						</apex:outputText>
					</apex:column> 
 					
                    <apex:column headerValue="Date of trip" >
                       <apex:inputField value="{!me.Date__c}"  required="true"/>
 					</apex:column>
                    
                    <apex:column headerValue="Purpose and Description" >
                       <apex:inputField value="{!me.Name}" id="name" required="true"/>
 					</apex:column> 
 


                    <apex:column headerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 style="width:50px" footerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 rendered = "{! If(Expense_Report__c.Program_1_Number__c== null ,false,true) }">
                        <apex:inputField value="{!me.Prgm_1_Miles__c}" style="width:50px" ></apex:inputField>
                     </apex:column>
                        
                        <apex:column headerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_2_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_2_Miles__c}"  style="width:50px"  ></apex:inputField>
 					    </apex:column> 
                            
                      <apex:column headerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   style="width:50px" footerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   rendered = "{! If(Expense_Report__c.Program_3_Number__c== null ,false,true)}">
                          <apex:inputField value="{!me.Prgm_3_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                        <apex:column headerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_4_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_4_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                            
                            <apex:column headerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         style="width:50px" footerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         rendered = "{! If(Expense_Report__c.Program_5_Number__c== null ,false,true) }">
                                <apex:inputField value="{!me.Prgm_5_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                        
                      <apex:column headerValue="{! Expense_Report__c.Program_6_Number__c}" 
                                   footerValue="{! Expense_Report__c.Program_6_Number__c}" style="width:50px" 
                                   rendered = "{! If(Expense_Report__c.Program_6_Number__c== null ,false,true) }">
                          <apex:inputField value="{!me.Prgm_6_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                
                    <apex:column headerValue="Total Miles" footerValue= "Total Miles" style="width:50px">
                        <apex:inputField value="{!me.Total_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                             
                    <apex:column headerValue="Action" >
                         <apex:commandButton value="Delete" action="{!deleteRow}" reRender="er">
 						<apex:param name="rowIndex" value="{!rowNumber}"/>
                      </apex:commandButton>
                         <apex:variable var="rowNumber" value="{!rowNumber+1}"/>
                        </apex:column> 

                 </apex:pageBlockTable>
                                    
               <apex:commandButton action="{!addRow}" value="Add Expense" reRender="er"/>
 	           </apex:pageblockSection>
                              
 			<apex:pageBlockButtons >
 		                <apex:commandButton value="Save" action="{!ave}" />
 		         <apex:commandButton value="Cancel" action="{!cancel}"/>
 			</apex:pageBlockButtons>
 		</apex:pageBlock>

       
 		
 	</apex:form> 
 </apex:page>

And here's the controller: 
 
public class addMileageExpense {
public Expense_Report__c reports;
 public Mileage_expense__c del;
 public List<Mileage_expense__c> addexpenseList {get;set;}
 public List<Mileage_expense__c> delexpenseList {get;set;}
 public List<Mileage_expense__c> expenseList {get;set;}
 public Integer totalCount {get;set;}
 public Integer rowIndex {get;set;}
 public List<Mileage_expense__c> delexpense {get; set;} 
 public addMileageExpense(ApexPages.StandardController controller) {
 
 reports = (Expense_Report__c)controller.getRecord();
 expenseList = [Select id, Name, Expense_Report__c, Miles__c, Total_Miles__c,   
                Date__c, Prgm_1_Miles__c, Prgm_2_Miles__c, Prgm_3_Miles__c, Prgm_4_Miles__c, 
                Prgm_5_Miles__c, Prgm_6_Miles__c from Mileage_expense__c where Expense_Report__c =: reports.ID];
 totalCount = expenseList.size();
 
 delexpenseList = new List<Mileage_expense__c>();
 delexpense = new List<Mileage_expense__c>();
 }
 
 public void addRow(){
 addexpenseList = new List<Mileage_expense__c>();
 expenseList.add(new Mileage_expense__c(Expense_Report__c = reports.Id));
 }
 
 public PageReference ave(){
 
 upsert expenseList;
 delete delexpenseList;
 return (new ApexPages.StandardController(reports)).view();
 } 
 
 public void deleteRow(){
 
 rowIndex = Integer.valueOf(ApexPages.currentPage().getParameters().get('rowIndex'));
 System.debug('row to be deleted ' + rowIndex );
 System.debug('row to be deleted '+ expenseList[rowIndex]);

     del = expenseList.remove(rowIndex);
 
         delexpenseList.add(del);
     
 }
 }


 
Best Answer chosen by Collen Mayer 6
Arshadulla.ShariffArshadulla.Shariff

Hello Mayer,
please note the following changes made to vf code .
apex:commandButton has the atttribute immediate,which accepts boolean value,it skips the validation on the page.
For More Details visit the following
https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_compref_commandButton.htm

  <apex:commandButton value="Delete" action="{!deleteRow}" reRender="er" immediate="true">
                         <apex:param name="rowIndex" value="{!rowNumber}"/>
                      </apex:commandButton>
                         <apex:variable var="rowNumber" value="{!rowNumber+1}"/>
                        </apex:column>

<apex:page standardController="Expense_Report__c" extensions="addMileageExpense" sidebar="false">
 <table>
    <colgroup>
            <col span="2" /><col />
  	</colgroup>
  <tr>
    <td><h2>
        Expense Report Name:</h2></td>
      <td> <apex:outputField value="{! Expense_Report__c.Name__c }"/></td>  
  </tr>
  <tr></tr>
  <tr>
      <td><h2>
          
          Start Date:</h2> </td>
      <td><apex:outputField value="{! Expense_Report__c.Start_Date__c}"/></td>
  </tr>

    <br/>
    <br/>
            <td><h2>
          Expense Report:</h2> </td>
      
     <td><apex:outputField value="{!Expense_Report__c.id}"/>	</td>
</table>
        <br/>
    <br/>
    <apex:form >

 		<apex:pageBlock title="Mileage Report" id="er">
 		
            <apex:pageMessages />
 		<apex:variable var="rowNumber" value="{!0}"/>
               <apex:pageblockSection columns="1" id ="mytable">
                   <apex:actionSupport event="onchange" reRender="mytable"/>   
 				<apex:pageBlockTable title="Mileage Expenses" var="me" value="{!expenseList}"> 

 					<apex:column headerValue="Entry" style="width:20px; text-align:center;" headerClass="centertext">
 						<apex:outputText value="{0}" style="text-align:center;"> 
 							<apex:param value="{!rowNumber+1}" /> 
 						</apex:outputText>
					</apex:column> 
 					
                    <apex:column headerValue="Date of trip" >
                       <apex:inputField value="{!me.Date__c}"  required="true"/>
 					</apex:column>
                    
                    <apex:column headerValue="Purpose and Description" >
                       <apex:inputField value="{!me.Name}" id="name" required="true"/>
 					</apex:column> 
 


                    <apex:column headerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 style="width:50px" footerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 rendered = "{! If(Expense_Report__c.Program_1_Number__c== null ,false,true) }">
                        <apex:inputField value="{!me.Prgm_1_Miles__c}" style="width:50px" ></apex:inputField>
                     </apex:column>
                        
                        <apex:column headerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_2_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_2_Miles__c}"  style="width:50px"  ></apex:inputField>
 					    </apex:column> 
                            
                      <apex:column headerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   style="width:50px" footerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   rendered = "{! If(Expense_Report__c.Program_3_Number__c== null ,false,true)}">
                          <apex:inputField value="{!me.Prgm_3_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                        <apex:column headerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_4_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_4_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                            
                            <apex:column headerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         style="width:50px" footerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         rendered = "{! If(Expense_Report__c.Program_5_Number__c== null ,false,true) }">
                                <apex:inputField value="{!me.Prgm_5_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                        
                      <apex:column headerValue="{! Expense_Report__c.Program_6_Number__c}" 
                                   footerValue="{! Expense_Report__c.Program_6_Number__c}" style="width:50px" 
                                   rendered = "{! If(Expense_Report__c.Program_6_Number__c== null ,false,true) }">
                          <apex:inputField value="{!me.Prgm_6_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                
                    <apex:column headerValue="Total Miles" footerValue= "Total Miles" style="width:50px">
                        <apex:inputField value="{!me.Total_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                             
                    <apex:column headerValue="Action" >
                         <apex:commandButton value="Delete" action="{!deleteRow}" reRender="er"  immediate="true">
 						<apex:param name="rowIndex" value="{!rowNumber}"/>
                      </apex:commandButton>
                         <apex:variable var="rowNumber" value="{!rowNumber+1}"/>
                        </apex:column> 

                 </apex:pageBlockTable>
                                    
               <apex:commandButton action="{!addRow}" value="Add Expense" reRender="er"/>
 	           </apex:pageblockSection>
                              
 			<apex:pageBlockButtons >
 		                <apex:commandButton value="Save" action="{!ave}" />
 		         <apex:commandButton value="Cancel" action="{!cancel}"/>
 			</apex:pageBlockButtons>
 		</apex:pageBlock>

       
 		
 	</apex:form> 
 </apex:page>

If this solves your problem,Mark it Solved.
It will help other community users

All Answers

Arshadulla.ShariffArshadulla.Shariff

Hello Mayer,
please note the following changes made to vf code .
apex:commandButton has the atttribute immediate,which accepts boolean value,it skips the validation on the page.
For More Details visit the following
https://developer.salesforce.com/docs/atlas.en-us.pages.meta/pages/pages_compref_commandButton.htm

  <apex:commandButton value="Delete" action="{!deleteRow}" reRender="er" immediate="true">
                         <apex:param name="rowIndex" value="{!rowNumber}"/>
                      </apex:commandButton>
                         <apex:variable var="rowNumber" value="{!rowNumber+1}"/>
                        </apex:column>

<apex:page standardController="Expense_Report__c" extensions="addMileageExpense" sidebar="false">
 <table>
    <colgroup>
            <col span="2" /><col />
  	</colgroup>
  <tr>
    <td><h2>
        Expense Report Name:</h2></td>
      <td> <apex:outputField value="{! Expense_Report__c.Name__c }"/></td>  
  </tr>
  <tr></tr>
  <tr>
      <td><h2>
          
          Start Date:</h2> </td>
      <td><apex:outputField value="{! Expense_Report__c.Start_Date__c}"/></td>
  </tr>

    <br/>
    <br/>
            <td><h2>
          Expense Report:</h2> </td>
      
     <td><apex:outputField value="{!Expense_Report__c.id}"/>	</td>
</table>
        <br/>
    <br/>
    <apex:form >

 		<apex:pageBlock title="Mileage Report" id="er">
 		
            <apex:pageMessages />
 		<apex:variable var="rowNumber" value="{!0}"/>
               <apex:pageblockSection columns="1" id ="mytable">
                   <apex:actionSupport event="onchange" reRender="mytable"/>   
 				<apex:pageBlockTable title="Mileage Expenses" var="me" value="{!expenseList}"> 

 					<apex:column headerValue="Entry" style="width:20px; text-align:center;" headerClass="centertext">
 						<apex:outputText value="{0}" style="text-align:center;"> 
 							<apex:param value="{!rowNumber+1}" /> 
 						</apex:outputText>
					</apex:column> 
 					
                    <apex:column headerValue="Date of trip" >
                       <apex:inputField value="{!me.Date__c}"  required="true"/>
 					</apex:column>
                    
                    <apex:column headerValue="Purpose and Description" >
                       <apex:inputField value="{!me.Name}" id="name" required="true"/>
 					</apex:column> 
 


                    <apex:column headerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 style="width:50px" footerValue="{! Expense_Report__c.Program_1_Number__c}" 
                                 rendered = "{! If(Expense_Report__c.Program_1_Number__c== null ,false,true) }">
                        <apex:inputField value="{!me.Prgm_1_Miles__c}" style="width:50px" ></apex:inputField>
                     </apex:column>
                        
                        <apex:column headerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_2_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_2_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_2_Miles__c}"  style="width:50px"  ></apex:inputField>
 					    </apex:column> 
                            
                      <apex:column headerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   style="width:50px" footerValue="{! Expense_Report__c.Program_3_Number__c}" 
                                   rendered = "{! If(Expense_Report__c.Program_3_Number__c== null ,false,true)}">
                          <apex:inputField value="{!me.Prgm_3_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                        <apex:column headerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     style="width:50px" footerValue="{! Expense_Report__c.Program_4_Number__c}" 
                                     rendered = "{! If(Expense_Report__c.Program_4_Number__c== null ,false,true) }">
                            <apex:inputField value="{!me.Prgm_4_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                            
                            <apex:column headerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         style="width:50px" footerValue="{! Expense_Report__c.Program_5_Number__c}" 
                                         rendered = "{! If(Expense_Report__c.Program_5_Number__c== null ,false,true) }">
                                <apex:inputField value="{!me.Prgm_5_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                        
                      <apex:column headerValue="{! Expense_Report__c.Program_6_Number__c}" 
                                   footerValue="{! Expense_Report__c.Program_6_Number__c}" style="width:50px" 
                                   rendered = "{! If(Expense_Report__c.Program_6_Number__c== null ,false,true) }">
                          <apex:inputField value="{!me.Prgm_6_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                
                    <apex:column headerValue="Total Miles" footerValue= "Total Miles" style="width:50px">
                        <apex:inputField value="{!me.Total_Miles__c}"  style="width:50px"  ></apex:inputField>
 					</apex:column> 
                          
                             
                    <apex:column headerValue="Action" >
                         <apex:commandButton value="Delete" action="{!deleteRow}" reRender="er"  immediate="true">
 						<apex:param name="rowIndex" value="{!rowNumber}"/>
                      </apex:commandButton>
                         <apex:variable var="rowNumber" value="{!rowNumber+1}"/>
                        </apex:column> 

                 </apex:pageBlockTable>
                                    
               <apex:commandButton action="{!addRow}" value="Add Expense" reRender="er"/>
 	           </apex:pageblockSection>
                              
 			<apex:pageBlockButtons >
 		                <apex:commandButton value="Save" action="{!ave}" />
 		         <apex:commandButton value="Cancel" action="{!cancel}"/>
 			</apex:pageBlockButtons>
 		</apex:pageBlock>

       
 		
 	</apex:form> 
 </apex:page>

If this solves your problem,Mark it Solved.
It will help other community users
This was selected as the best answer
Collen Mayer 6Collen Mayer 6
So simple!  This is just what I needed.  Thanks!

Collen Mayer