For-each循环in rich:subTable

时间:2011-07-19 14:09:52

标签: java jsf richfaces

是否可以在Richfaces 3.3中的forEach组件中使用subTable循环?我需要渲染动态数量的列,但没有成功。

示例:

<rich:dataTable 
       cellpadding="0" cellspacing="0" 
       width="700" border="1" var="serviceCharge"
       value="#{group.serviceCharges}">
    <rich:column colspan="3">
        <h:outputText value="#{group.name},#{serviceCharge.code}" />
    </rich:column>
    <rich:subTable var="priceType" value="#{serviceCharge.priceTypes}">
        <rich:column colspan="#{group.priceLevels.size}">
            <b><h:outputText value="#{priceType.name}" /></b>
        </rich:column>
        <rich:subTable var="priceLevelItem" value="#{priceType.priceLevels}">
            <rich:column colspan="3">
                <h:outputText value="Qty" />
            </rich:column>
            <c:forEach items="#{priceType.priceLevels}" var="priceLevelItem">
                <rich:column colspan="3">
                    <h:outputText value="#{priceLevelItem.id},#{priceLevelItem.qty}" />
                </rich:column>                              
            </c:forEach>
         </rich:subTable>                                                   
        <rich:subTable var="priceLevelItem" value="#{priceType.priceLevels}">
            <rich:column colspan="3">
                <h:outputText value="Amount" />
            </rich:column>
            <rich:column colspan="3">
                <h:outputText value="#{priceLevelItem.id},#{priceLevelItem.amount}" />
            </rich:column>
        </rich:subTable>                                                    
    </rich:subTable>
</rich:dataTable>

由于

2 个答案:

答案 0 :(得分:2)

是的,你可以。

您可以使用以下代码来定义列列表:

<ui:param name="fields" value="colname1, colname2, colname3"/>

dataTable

的列部分迭代它
<rich:dataTable binding="#{backingBean.table}"
        value="#{backingBean.list}" var="row">
    <ui:insert name="extraColumnsFirst"></ui:insert>
    <f:facet name="header">
        <rich:columnGroup>
            <ui:insert name="extraColumnsHeaderFirst"/>
            <c:forEach items="${fn:split(fields, ',')}"
                    var="fieldName" varStatus="status">
                <rich:column>
                    <h:outputText  value="${fieldName}" />
                </rich:column>
            </c:forEach>
        </rich:columnGroup>
    </f:facet>
    <c:forEach items="${fn:split(fields, ',')}"
            var="fieldName" varStatus="status">
        <rich:columnid="column_${fieldName}_${status.index}">
            <f:facet name="header"></f:facet>
            <h:outputText id="${fieldName}_${status.index}"
                    value="${row[fieldName]}">
            </h:outputText>
        </rich:column>
    </c:forEach>
    <ui:insert name="extraColumnsLast">
    </ui:insert>
    <f:facet name="footer">
        <rich:datascroller id="ds" renderIfSinglePage="false">
        </rich:datascroller>
    </f:facet>
</rich:dataTable>

答案 1 :(得分:2)

是的,c:forEach可用于生成动态列数(适用于rich:dataTablerich:subTable)。

在您的示例中,它不起作用,因为您尝试引用未定义的变量priceTypec:forEachTagHandler,因此它正在尝试评估priveType在构建树时; rich:dataTableComponent,它仅在渲染响应中定义var priveType

有关此事的更多信息,请阅读以下文章:TagHandler vs Component