Primefaces static and dynamic columns in datatable

It isn’t possible to define columns based on row data. Imagine that row 1 has 2 columns, row 2 has 6 columns, row 3 has 1 column, etc how would you ever produce a technically valid table in HTML? Each row must have the same amount of columns.

You’ve 2 options, depending on whether can change the model or not:

  1. If you can’t change the model, then you need to replace that <p:columns> by a single <p:column> and loop over the #{data.optionalValues} using a nested loop with e.g. <ui:repeat> or perhaps even another <p:dataTable><p:columns>:

    <p:column>
        <p:dataTable value=""><!-- Empty string as value forces 1 row. -->
            <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}">
                #{opt.value}
            </p:columns>
        </p:dataTable>
    </p:column>
    
  2. If you can change the model, then you need to let <p:columns value> point to a bean property instead of to a row property, so that it’s exactly the same for every row. This works if you replace List<Tupel> optionalValues by Map<String, Tupel> optionalValues where the key is Tupel#id and add a List<String> property to the bean containing all available Tupel#id values.

    <p:columns value="#{tableOverviewBean.availableTupelIds}" var="id" headerText="#{id}">
        #{data.optionalValues[id].value}
    </p:columns>
    

Leave a Comment