具有richfaces的动态列4

Kar*_*dén 5 richfaces servlet-3.0 jsf-2

我需要动态的列数.Richfaces <rich:columns>在3.3.3-final中提供丰富的表面,但对于Richfaces 4,他们似乎推荐<c:forEach>.

C:的forEach

我不能让它正常工作.因为我无法依赖数据表中的var我无法弄清楚如何<c:forEach>使用正确的列列表进行提供.(每行都有自己的值但标题相同)

基本上我要显示的数据是具有x大小的行的列表,每行有列值与Y大小的列表.但是怎么能<c:forEach>告诉支持bean它是什么行所以我可以提供正确的列?

UI/A4J:重复

我不想重新发明轮子,因为我需要冷冻柱和许多其他功能.以这种方式创建表html并使用jQuery来考虑其他功能.然而,这对维持和开展大量工作毫无希望.

我还看了从支持bean构建它动态创建子项但我完全不喜欢它.这必须是最后的手段.

使用:Tomcat 7,servlet 3.0,JSF 2.1x - Mojarra,Richfaces 4.x.

更新

好的,所以我最终得到了一些结果.但是我的标题没有显示.值显示完美但不显示标题.使用迭代或其他东西做一些问题?

    <rich:dataTable value="#{controller.rows}"
        var="row">
        <c:forEach items="#{controller.columns}" var="column">
            <rd:column id="name" width="250">
                <f:facet name="header">
                    <h:outputText value="#{row.myArrayList[column].header}" />
                </f:facet>
                <h:inputText value="#{row.myArrayList[column].value}"  disabled="#{row.myArrayList[column].open}"/>
            </rd:column>
        </c:forEach>
    </rich:dataTable>
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 7

<c:forEach>确实是你能得到的最好的.<ui/a4j:repeat>在视图渲染时间运行时,它将不起作用,而UIData组件确实需要UIColumn子项,而不是UIRepeat子项.

为了使其<c:forEach>工作,您需要提供所有属性名称的列表/地图(如果地图也可能是标题标签).这里有一个具体的开球例如假设Item有性能id,namevalue#{bean.itemPropertyNames}返回一个List<String>带有完全相同的属性名称.

<rich:dataTable value="#{bean.items}" var="item">
    <c:forEach items="#{bean.itemPropertyNames}" var="itemPropertyName">
        <rich:column>
            #{item[itemPropertyName]}
        </rich:column> 
    </c:forEach>
</rich:dataTable>
Run Code Online (Sandbox Code Playgroud)

如果您还需要显示列标题,那么最好是Map<String, String>使用键表示属性名称,值表示标题值.

<rich:dataTable value="#{bean.items}" var="item">
    <c:forEach items="#{bean.itemProperties}" var="itemProperty">
        <rich:column>
            <f:facet name="header">#{itemProperty.value}</f:facet>
            #{item[itemProperty.key]}
        </rich:column> 
    </c:forEach>
</rich:dataTable>
Run Code Online (Sandbox Code Playgroud)

无论哪种方式,唯一的缺点是这个构造中#{bean}<c:forEach items>can不是视图范围的.它将在每个请求上重新创建,除非您关闭部分状态保存.它需要是一个请求作用域(或会话或应用程序).请注意,它不一定需要与中的bean相同<rich:dataTable value>.

也可以看看: