在datatable中如何使用ui:repeat来追加列?

3

我想要生成一个表格列表,每个月份对应一个表格,每个表格有该月份天数的列。以下是我使用的JSF代码片段。

<ui:repeat value="#{worklogService.months}" var="monthnum">
    <p:dataTable value="#{worklogService.getTableForMonth(monthnum)}" var="tabrow">
        <p:column headerText="Name">
            <h:outputLabel value="#{tabrow.get(0)}"></h:outputLabel>
        </p:column>
        <ui:repeat value="#{worklogService.getDaysOfMonth(monthnum)}" var="daynum">
            <p:column headerText="#{daynum}">
                <h:outputText value="#{tabrow.get(daynum)}"></h:outputText>
            </p:column> 
        </ui:repeat>
    </p:dataTable>
</ui:repeat>

#{worklogService.months} 返回一个 List<Integer>,每个月对应一个数字。

#{worklogService.getTableForMonth(monthnum)} 返回一个 List<List<String>>

每张表格的第一列都是相同的。我想根据月份生成其它所有列。结果应该是12张表格,每张表格只有1列(第一列相同)。这里可能出了什么问题?如何解决?

1个回答

15
这个结构会失败,因为UIData组件(如<p:dataTable>)仅支持UIColumn子元素,而在<p:dataTable>中,UIColumn子元素只能是<p:column><p:columns>

在您的特定情况下,您有两个选项:

  1. Use <p:columns> instead of <ui:repeat><p:column>:

    <p:columns value="#{worklogService.getDaysOfMonth(monthnum)}" var="daynum" headerText="#{daynum}">
        #{tabrow.get(daynum)}
    </p:columns> 
    
  2. Use <c:forEach> instead of <ui:repeat> (explained here):

    <c:forEach items="#{worklogService.getDaysOfMonth(monthnum)}" var="daynum">
        <p:column headerText="#{daynum}">
            <h:outputText value="#{tabrow.get(daynum)}"></h:outputText>
        </p:column> 
    </c:forEach>
    

方案1无法工作,因为在PrimeFaces >4.0(.x)中存在此错误,他们“拒绝”修复它(或者至少以错误的原因关闭)。这也会发生在其他“重复”组件中,例如选项卡和他们自己的数据表。 - Kukeltje
@balus 当DataTable在UI:repeat中使用时,DataTable内部的滚动条无法正常工作(如果我水平滚动我的第一个DataTable滚动条,仅与我的DataTable一起,第二个DataTable的标题也会被滚动)。 - goku

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接