具有动态列的数据表,每个对象具有多个列

时间:2017-10-30 14:34:21

标签: jsf primefaces

我有每个项目(Apple,Banana)的动态测试次数(测量值),每个测试都有2个属性(强制,可见)。我需要的是将这些测试显示为列(colspan = 2)及其属性(colspan = 1)的表,如下例所示。我可以为表头执行它(使用Primefaces的p:columnGroup)但我不知道如何在迭代属性列表时为每个Property填充两列。

example

我只有想法是制作新的List,其中每个项目将存在两次(直径,直径,长度,长度),迭代它并使用一些模数条件来选择正确的属性。

我目前的解决方案是:

XHTML

<p:dataTable var="scenario">
    ...
    <p:columns var="property" value="#{view.getXTimesProperties()}"
                       columnIndexVar="index">
        <c:set var="test" value="#{view.getTest(scenario, property)}"/>
        <c:choose>
            <c:when test="${index % 2 == 0}">
                <h:outputText value="#{test.mandatory}"/>
            </c:when>
            <c:when test="${index % 2 == 1}">
                <h:outputText value="#{test.visible}"/>
            </c:when>
        </c:choose>
    </p:columns>
</p:dataTable>

和View方法是

public List<Property> getXTimesProperties() {
    List<Property> list = new ArrayList<>(properties.size() * 2);
    for (Property property : properties) {
        list.add(property);
        list.add(property);
    }
    return list;
}

有更好的方法吗?提前感谢您提出更好的想法!

1 个答案:

答案 0 :(得分:0)

是的,更好的方式(Kukeltje学分):

<p:dataTable var="scenario">
    ...
    <c:forEach var="property" items="#{view.properties}">
        <c:set var="test" value="#{view.getTest(scenario, property)}"/>
        <p:column>
                <h:outputText value="#{test.mandatory}"/>
        </p:column>     
        <p:column>
                <h:outputText value="#{test.visible}"/>
        </p:column>
    </c:forEach>
</p:dataTable>