You should have a wrapper class inside your controller that holds the custom object row and the flag: public class TestTaskController1 { public class ReportInformation{ public Report_Information__c task{get;set;} public Boolean saved{get;set;} } public List<ReportInformation> reportInfos{get;set;} ... } Then on your page, you can display read-only vs editable view of the row like this: <apex:pageBlockTable value="{!reportInfos}" var="rInfo"> <apex:column headerValue="Report Name"> <apex:outputField value="{!rInfo.task.Report_Name__c}" rendered="{!rInfo.saved}"/> <apex:inputField value="{!rInfo.task.Report_Name__c}" rendered="{!NOT(rInfo.saved)}"/> </apex:column> <br/> <apex:column headerValue="Comments"> <apex:outputField value="{!rInfo.task.Comments__c}" rendered="{!rInfo.saved}"/> <apex:inputField value="{!rInfo.task.Report_Name__c}" rendered="{!NOT(rInfo.saved)}"/> <br /> </apex:column> </apex:pageBlockTable> UPDATE: In the constructor, set them all to false, so the input fields are displayed. Then in your action method, set it to true. You should have a list of ReportInformation items like I have in my answer. Iterate over your results from Report_Information__c and then add to the reportInfos list. for(Report_Information__C ri: [select id,... from Report_Information__C]) { ReportInformation repInfo = new ReportInformation(); repInfo.saved = false; repInfo.task = ri; repInfos.add(repInfo); } HTH