You need to sign in to do that
Don't have an account?
<apex:repeat> and related lists
I have custom objects and a custom controller
content_Body__c is a child of content__c There can be multiple children.
The controller get method looks like this:
public Content__c getContent() {
Content__c content =
[select id, Name, Release_Date__c, Heading__c, Synopsis__c,
(select Name, Content__c, URL_Link__c, Image__c, Description_Text__c
from Content_Body__r order by name)
from Content__c where id = :thisContent LIMIT 1];
return content;
}
and in a vf page this
{!content.Name}<br/>
{!content.Release_Date__c}<br/>
{!content.Heading__c}<br/>
{!content.Synopsis__c}<br/>
<div class="article-content">
<apex:outputText escape="false" value="{!content.content_body__r[0].Image__c}" />
<apex:outputText escape="false" value="{!content.content_body__r[0].URL_Link__c}" />
<apex:outputText escape="false" value="{!content.content_body__r[0].Description_Text__c}" />
</div>
renders fine.
But I want to display all the related content_body__c elements, so I'm using apex:repeat, and this
<apex:repeat var="cb" value="{!content.content_body__r}" >
<div class="article-content">
<apex:outputText escape="false" value="{!cb.Description_Text__c}" />
</div>
</apex:repeat>
gives a run-time error of
List has no rows for assignment to SObject
An unexpected error has occurred. Your development organization has been notified.
What am I doing wrong here? How can there be no rows when the explicit [0] reference finds one???
I discovered that if I wrap the apex:repeat in an apex:panelGroup component, it all works fine (no idea why). I can also use the panel Group to test for no records returned - which is a nice bonus.
<apex:panelGroup layout="inlined" rendered="{!content.content_body__r.size > 0}">
<apex:repeat var="cb" value="{!content.content_body__r}" >
<div class="clearfix article-content">
<a class="logo" href="{!cb.URL_Link__c}" target="_blank">
<apex:outputText escape="false" styleClass="logosize" style="float:left"
value="{!cb.Image__c}" />
</a>
<apex:outputText escape="false" style="float:left" value="{!cb.Description_Text__c}" />
</div>
<br/>
</apex:repeat>
</apex:panelGroup>
All Answers
The assignment to a single object requires the query to return a single row. This error generally comes because query doesn't return any records and you are assigning it directly to an sObject.May be you can try replacing sObject with list of sObject.
I discovered that if I wrap the apex:repeat in an apex:panelGroup component, it all works fine (no idea why). I can also use the panel Group to test for no records returned - which is a nice bonus.
<apex:panelGroup layout="inlined" rendered="{!content.content_body__r.size > 0}">
<apex:repeat var="cb" value="{!content.content_body__r}" >
<div class="clearfix article-content">
<a class="logo" href="{!cb.URL_Link__c}" target="_blank">
<apex:outputText escape="false" styleClass="logosize" style="float:left"
value="{!cb.Image__c}" />
</a>
<apex:outputText escape="false" style="float:left" value="{!cb.Description_Text__c}" />
</div>
<br/>
</apex:repeat>
</apex:panelGroup>