You need to sign in to do that
Don't have an account?
Chirag_Joshi
<apex:actionsupport> not working for <apex:inputcheckbox> for "onchange" event under <apex:repeat> tag
I am trying to dynamically display objects and there related objects records in a table. I am struck with the following problem
The <apex:actionsupport> is not working for the following:
VF Page:
Apex Controller:
However the following similar sample is working fine
VF Page:
Apex Controller:
The <apex:actionsupport> is not working for the following:
VF Page:
<apex:page controller="MyController" tabStyle="Account"> <apex:form > <apex:pageBlock title="{!selectedObj} Records"> <apex:pageBlockTable value="{!mainObjLst}" var="rec"> <apex:column headerValue="Related Records" width="10%"> <apex:commandButton value="Show" action="{!show}" reRender="relatedRec"> <apex:param name="Abc" value="{!rec.Id}" assignTo="{!recordId}"/> </apex:commandButton> <apex:commandButton value="Hide" action="{!hide}" reRender="relatedRec"/> </apex:column> <apex:repeat value="{!mainselectedFld}" var="fld"> <apex:column value="{!rec[fld]}"/> </apex:repeat> <apex:column id="relatedRec" breakBefore="true" colspan="{!mainselectedFld.size + 1}" > <apex:pageBlock title="Child Records" rendered="{!showRelated}"> <apex:repeat value="{!relatedFldMapVF}" var="rlRec"> <apex:variable value="{!relatedObjLst[rlRec]}" var="myMap"/> <apex:pageBlockSection title="{!rlRec}" columns="1"> <apex:pageBlockTable value="{!relatedObjLst[rlRec]}" var="rlLst" rendered="{!myMap.size > 0}"> <apex:column > <apex:facet name="header"> Select </apex:facet> <apex:inputCheckbox> <apex:actionSupport action="{!anyMethod}" event="onchange" /> </apex:inputCheckbox> </apex:column> <apex:repeat value="{!relatedFldMapVF[rlRec]}" var="fld"> <apex:column > <apex:facet name="header"> {!$ObjectType[rlRec].Fields[fld].Label} </apex:facet> <apex:outputField value="{!rlLst[fld]}"/> </apex:column> </apex:repeat> </apex:pageBlockTable> </apex:pageBlockSection> <center> <apex:commandButton value="Delete" action="{!deleteRecords}" rendered="{!myMap.size > 0}"/> <apex:commandButton value="Update" action="{!updateRecords}" rendered="{!myMap.size > 0}"/> </center> </apex:repeat> </apex:pageBlock> </apex:column> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page>
Apex Controller:
public class MyController{ public String selectedObj {get;set;} public List<sObject> mainObjLst{get;set;} public Map<String, List<sObject>> relatedObjLst{get;set;} public Map<String, List<String>> relatedFldMap{get;set;} public Map<String, List<String>> relatedFldMapVF {get; set;} public Map<String, String> rlFld{get;set;} public List<String> mainselectedFld{get;set;} public Map<String, sObject> relatedObjectLst {get; set;} public Id recordId{get;set;} public Boolean showRelated{get;set;} public Map<ID, RecordWrapperClass> mapHoldingSelectedRecords {get;set;} public List<RecordWrapperClass> RecordWrapperRecordList {get;set;} public MyController(){ selectedObj = 'Account'; showRelated = false; mainselectedFld = getDefaultFields(selectedObj); instantiaterlFld(); instantiaterelatedObjectLst(); instantiaterelatedFldMapVF(); instantiaterelatedFldMap(); mainObjLst = Database.query(getQuery()); relatedObjLst = new Map<String, List<sObject>>(); mapHoldingSelectedRecords = new Map<ID, RecordWrapperClass>(); RecordWrapperRecordList = new List<RecordWrapperClass>(); } public void instantiaterelatedObjectLst(){ relatedObjectLst = new Map<String, sObject>(); for(String s: getAllRelatedObject(selectedObj)){ relatedObjectLst.put(s, ConvertTosObject(s)); } } public void instantiaterelatedFldMapVF(){ relatedFldMapVF = new Map<String, List<String>>(); for(String so: getAllRelatedObject(selectedObj)){ relatedFldMapVF.put(so, getDefaultFields(so)); } } public void instantiaterelatedFldMap(){ relatedFldMap = new Map<String, List<String>>(); for(String so: getAllRelatedObjectWithRelationshipName(selectedObj)){ relatedFldMap.put(so, getDefaultFields(rlFld.get(so))); } } public void instantiaterlFld(){ rlFld = new Map<String, String>(); for (Schema.ChildRelationship cr: Schema.getGlobalDescribe().get(selectedObj).getDescribe().getChildRelationships()) { rlFld.put(cr.getRelationshipName(), String.valueOf(cr.getChildSObject())); } } public List<String> getAllRelatedObject(String obj){ Set<String> rObjLst = new Set<String>(); for (Schema.ChildRelationship cr: Schema.getGlobalDescribe().get(obj).getDescribe().getChildRelationships()) { if(cr.getRelationshipName() != null) rObjLst.add(String.valueOf(cr.getChildSObject())); } return filterObjectList(new List<String>(rObjLst)); } public List<String> getAllRelatedObjectWithRelationshipName(String obj){ Set<String> rObjLst = new Set<String>(); for (Schema.ChildRelationship cr: Schema.getGlobalDescribe().get(obj).getDescribe().getChildRelationships()) { if(getAllRelatedObject(obj).contains(String.valueOf(cr.getChildSObject())) && cr.getRelationshipName() != null) rObjLst.add(cr.getRelationshipName()); } return new List<String>(rObjLst); } public sObject ConvertTosObject(String objName){ return Schema.getGlobalDescribe().get(objName).newsObject(); } public List<String> filterObjectList(List<String> objLst){ List<String> mainLst = new List<String>{'Account', 'Asset', 'Campaign', 'Case', 'Contact', 'Contract', 'Opportunity', 'Order', 'Product', 'Solution', 'User', 'Task', 'Event'}; Set<String> setObjLst = new Set<String>(objLst); setObjLst.retainAll(mainLst); return new List<String>(setObjLst); } public List<String> getAllFields(String obj){ return new List<String>(Schema.getGlobalDescribe().get(obj).getDescribe().fields.getmap().keyset()); } public List<String> getRequiredFields(String obj){ List<String> reqfields = new List<String>(); for(String fld: Schema.getGlobalDescribe().get(obj).getDescribe().fields.getmap().keyset()){ if(isRequired(obj, fld)){ reqfields.add(fld); } } return reqfields; } public List<String> getDefaultFields(String obj){ if(obj == 'Account'){ return new List<String>{'Name', 'AccountNumber', 'Phone', 'Rating', 'Type', 'Industry'}; }else if(obj == 'Asset'){ return new List<String>{'Name', 'Product2Id', 'Price', 'Quantity', 'AccountId', 'ContactId'}; }else if(obj == 'Campaign'){ return new List<String>{'Name', 'isActive', 'Type', 'Status', 'StartDate', 'EndDate'}; }else if(obj == 'Case'){ return new List<String>{'CaseNumber', 'OwnerId', 'AccountId', 'ContactId', 'Status', 'Priority', 'Origin'}; }else if(obj == 'Contact'){ return new List<String>{'FirstName', 'LastName', 'AccountId', 'Phone', 'Email'}; }else if(obj == 'Contract'){ return new List<String>{'AccountId', 'Status', 'StartDate', 'ContractTerm'}; }else if(obj == 'Lead'){ return new List<String>{'FirstName', 'LastName', 'Company', 'LeadSource'}; }else if(obj == 'Opportunity'){ return new List<String>{'Name', 'Amount', 'Probability', 'StageName', 'CloseDate', 'ForecastCategoryName'}; }else if(obj == 'Order'){ return new List<String>{'AccountId', 'ContractId', 'Status', 'EffectiveDate', 'Type'}; }else if(obj == 'Product'){ return new List<String>{'Name', 'isActive', 'Family'}; }else if(obj == 'Solution'){ return new List<String>{'SolutionName', 'isPublished', 'SolutionNumber', 'Status'}; }else if(obj == 'User'){ return new List<String>{'FirstName', 'LastName', 'Alias', 'Email', 'UserName', 'CommunityNickname'}; }else if(obj == 'Task'){ return new List<String>{'Subject', 'WhoId', 'WhatId', 'Status', 'ActivityDate', 'Type'}; }else if(obj == 'Event'){ return new List<String>{'Subject', 'StartDateTime', 'EndDateTime', 'ActivityDate'}; } else{ return new List<String>{'Name'}; } } public Boolean isRequired(String obj, String fld){ return !Schema.getGlobalDescribe().get(obj).getDescribe().fields.getMap().get(fld).getDescribe().isNillable(); } public String getQuery(){ String s = 'SELECT ' + String.join(getDefaultFields(selectedObj), ', ') + getRelatedQuery() + ' FROM ' + selectedObj; System.debug('QUERY: ' + s); return s; } public String getRelatedQuery(){ if (relatedFldMap == null || relatedFldMap.isEmpty()) return ''; String qr = ', '; for(String s: relatedFldMap.keySet()){ qr += '( SELECT '; if(relatedFldMap.get(s) != null && !relatedFldMap.get(s).isEmpty()){ qr += String.join(relatedFldMap.get(s), ', '); }else{ qr += 'Name '; } qr += ' FROM '; qr += s; qr += ' ), '; } qr = qr.removeEnd(', '); return qr; } public void show(){ showRelated = true; sObject s = searchRecord(recordId); for(String rName: relatedFldMap.keySet()){ relatedObjLst.put(rlFld.get(rName), (s.getsObjects(rName)!=null)? s.getsObjects(rName): new List<sObject>()); } } public sObject searchRecord(Id rid){ for(sObject s: mainObjLst){ if(s.id == rid){ return s; } } return null; } public void hide(){ showRelated = false; } public PageReference deleteRecords(){ return null; } public PageReference updateRecords(){ return null; } public void anyMethod() { System.debug('Function: anyMethod'); } public class RecordWrapperClass { public Boolean isSelected {get;set;} public ID anyId {get;set;} public RecordWrapperClass(Id anyId, Boolean isSelected) { this.anyId = anyId; this.isSelected = isSelected; } } }
However the following similar sample is working fine
VF Page:
<apex:page controller="MyController1" tabStyle="Account"> <apex:form > <apex:pageBlock > <apex:pageBlockSection columns="1"> <apex:pageBlockTable value="{!acc}" var="a"> <apex:column value="{!a.Name}"/> <apex:column breakBefore="true" colspan="1"> <apex:pageBlock > <apex:pageBlockSection columns="1"> <apex:pageBlockTable value="{!con}" var="c"> <apex:column width="5%"> <apex:facet name="header"> First Name </apex:facet> <apex:inputCheckbox > <apex:actionSupport action="{!method}" event="onchange"/> </apex:inputCheckbox> </apex:column> <apex:column value="{!c.FirstName}"/> </apex:pageBlockTable> </apex:pageBlockSection> </apex:pageBlock> </apex:column> </apex:pageBlockTable> </apex:pageBlockSection> </apex:pageBlock> </apex:form> </apex:page>
Apex Controller:
public class MyController1 { public List<Account> acc {get;set;} public List<Contact> con {get;set;} public MyController1 (){ acc = [select name from account]; con = [Select firstname from contact]; } public void method(){ System.debug('Method Called'); } }