5

我需要动态列数。Richfaces 在 Richfaces 3.3.3-final 中为其提供了它,<rich:columns>但对于 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>
4

1 回答 1

7

<c:forEach>确实是你能得到的最好的。<ui/a4j:repeat>不会工作,因为它在视图渲染期间运行,而组件UIData确实需要UIColumn孩子,而不是UIRepeat孩子。

为了<c:forEach>让它工作,您需要向它提供所有属性名称的列表/映射(如果是映射,可能还有标题标签)。这是一个具体的启动示例,假设它Item具有 properties idname并且返回 a具有这些属性名称。value#{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>

如果您还需要显示列标题,那么最好有一个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>

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

也可以看看:

于 2012-12-12T12:12:48.853 回答