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
Chirag_JoshiChirag_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: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>&nbsp;&nbsp;
                    <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}"/>&nbsp;&nbsp;
                                <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');
    }
    
}