I have a simple controller extension with has a method which returns a Map<String, Map<String, Boolean>
.
public class UserExtension
{
private final User theUser;
public UserExtension(ApexPages.StandardController stdController)
{
this.theUser = (User)stdController.getRecord();
}
public Map<String, Map<String, Boolean>> getMap()
{
Map<String, Map<String, Boolean>> theMap = new Map<String, Map<String, Boolean>>();
theMap.put('Outer 1', new Map<String, Boolean> { 'Inner 1' => true, 'Inner 2' => false });
theMap.put('Outer 2', new Map<String, Boolean> { 'Inner 1' => true, 'Inner 2' => true });
return theMap;
}
}
If I use this with an apex:repeat
then everything works as expected:
<apex:page standardController="User" extensions="UserExtension">
<apex:pageBlock >
<apex:repeat value="{!Map}" var="outerKey">
{!outerKey}
<apex:repeat value="{!Map[outerKey]}" var="innerKey">
{!innerKey}
{!Map[outerKey][innerKey]}
</apex:repeat>
</apex:repeat>
</apex:pageBlock>
</apex:page>
However, if I then try and switch the outer apex:repeat
to an apex:pageBlockTable
I get the following error on my page:
Map key null not found in map
Error is in expression '{!Map[outerKey]}' in component in page userpage
<apex:page standardController="User" extensions="UserExtension">
<apex:pageBlock >
<apex:pageBlockTable value="{!Map}" var="outerKey">
<apex:column value="{!outerKey}"/>
<apex:repeat value="{!Map[outerKey]}" var="innerKey">
<apex:column headerValue="{!innerKey}">
{!Map[outerKey][innerKey]}
</apex:column>
</apex:repeat>
</apex:pageBlockTable>
</apex:pageBlock>
</apex:page>
Is it possible to use nested maps with apex:pageBlockTable
? Based on the behaviour of apex:repeat
I would think it is. In that case, have I come across a bug or am I missing something really obvious?