【问题标题】:Datatable with dynamic columns, multiple colums per object具有动态列的数据表,每个对象多列
【发布时间】:2017-10-30 14:34:21
【问题描述】:

我有每个项目(苹果、香蕉)的动态测试(测量)数量,每个测试都有 2 个属性(强制,可见)。我需要的是将这些测试显示为列 (colspan=2) 及其属性 (colspan=1) 的表格,如下例所示。我可以为表头执行此操作(使用 Primefaces 的 p:columnGroup),但我不知道如何在遍历属性列表时为每个属性填充两列。

我唯一的想法是创建新列表,其中每个项目将存在两次(直径、直径、长度、长度),对其进行迭代并使用一些模条件来选择正确的属性。

我目前的解决方案是:

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;
}

有没有更好的方法?提前感谢您提供更好的想法!

【问题讨论】:

  • 如果 coumns 没有动态变化(例如通过 ajax),您可以使用 c:foreach 来创建列数。循环遍历每个测试并在其中创建 2 coloumns
  • 感谢您的建议!我太专注于 p:columns。这对我来说是完美的。

标签: jsf primefaces


【解决方案1】:

是的,更好的方法(感谢 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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 2019-02-01
    • 2019-12-10
    • 1970-01-01
    • 2011-09-01
    • 2018-07-05
    相关资源
    最近更新 更多