I have a requirement to make a picklist which contains all the objects and based on the selected objects the corresponding fields will come in second picklist which is a multiSelect picklist. This should be in a pageBlockTable and wrapper class will be used so that I can have add Row functionality. A wrapper class will do the job but I am facing a problem.
I am following this approach:
Code
public class objectController
{
public List<wrap> wrapList{get;set;}
public objectController()
{
wrapList = new List<wrap>{ new wrap() };
}
public class wrap{
public Map <String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
public String selectedObject{get;set;}
public list<selectOption> selectedFields{get;set;}
Public wrap()
{
selectedObject = 'account';
}
public List<SelectOption> getObjectNames()
{
List<SelectOption> objNames = new List<SelectOption>();
List<String> entities = new List<String>(schemaMap.keySet());
entities.sort();
for(String name : entities)
{
objNames.add(new SelectOption(name,name));
}
return objNames;
}
public List<SelectOption> getObjectFields()
{
Map<String, Schema.SObjectType> schemaMap = Schema.getGlobalDescribe();
Schema.SObjectType ObjectSchema = schemaMap.get(selectedObject);
Map<String, Schema.SObjectField> fieldMap = ObjectSchema.getDescribe().fields.getMap();
List<SelectOption> fieldNames = new List<SelectOption>();
for (String fieldName: fieldMap.keySet())
{
fieldNames.add(new SelectOption(fieldName,fieldName));
}
return fieldNames;
}
}
}
Markup
<apex:page controller="objectController">
<apex:form >
<apex:pageblock >
<apex:pageBlockSection >
-----{!wrapList}
<apex:pageBlockTable var="row" value="{!wrapList}">
<apex:outputLabel value="Select Object : ">
<apex:selectList value="{!row.selectedObject}" size="1" >
<apex:selectOptions value="{!row.ObjectNames}">
</apex:selectOptions>
</apex:selectList>
</apex:outputLabel>
</apex:pageBlockTable>
</apex:pageBlockSection>
</apex:pageblock>
</apex:form>
</apex:page>