Primefaces static and dynamic columns in datatable

后端 未结 2 1959
礼貌的吻别
礼貌的吻别 2020-11-27 07:43

I am using Primefaces 5.0 to create a dynamic datatable.

My DataObject has some required fields and a List of optional \"tupel\" (key-value pair). The optional list

相关标签:
2条回答
  • 2020-11-27 08:17

    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>
      
    0 讨论(0)
  • 2020-11-27 08:20

    java:

    @Named
    @ViewScoped
    public class LiveRangeService implements Serializable {
        private List< Map<String, ColumnModel> > tableData;
        private List<ColumnModel> tableHeaderNames;
    
    
        public List<Map<String, ColumnModel>> getTableData() {
            return tableData;
        }
        public List<ColumnModel> getTableHeaderNames() {
            return tableHeaderNames;
        }
    
        public void PlayListMB() {
            tableData = new ArrayList< Map<String, ColumnModel> >();
    
            //Generate table header.
            tableHeaderNames = new ArrayList<ColumnModel>();
            for (int j = 0; j < 5; j++) {
                  tableHeaderNames.add(new ColumnModel("header "+j, " col:"+ String.valueOf(j+1)));
            }
    
            //Generate table data.
            for (int i = 0; i < 10; i++) {
                Map<String, ColumnModel> playlist = new HashMap<String, ColumnModel>();
                for (int j = 0; j < 5; j++) {
                    playlist.put(tableHeaderNames.get(j).key,new ColumnModel(tableHeaderNames.get(j).key,"row:" + String.valueOf(i+1) +" col:"+ String.valueOf(j+1)));
                }
                tableData.add(playlist);
            }
        }
    
        static public class ColumnModel implements Serializable {
    
            private String key;
            private String value;
    
            public ColumnModel(String key, String value) {
                this.key = key;
                this.value = value;
            }
    
            public String getKey() {
                return key;
            }
    
            public String getValue() {
                return value;
            }
        }
    

    And XHTML:

                    <h:form>
    
                        <p:dataTable id="tbl" var="result"
                            value="#{liveRangeService.tableData}"
                            rendered="#{not empty liveRangeService.tableData}"
                            rowIndexVar="rowIndex"
                            >
    
                            <f:facet name="header">  header table </f:facet>
    
                            <p:column>
                                <f:facet name="header">
                                    <h:outputText value="序号" />
                                </f:facet>
                                <h:outputText value="#{rowIndex+1}" />
                            </p:column>
    
                            <p:columns value="#{liveRangeService.tableHeaderNames}"
                                var="mycolHeader" columnIndexVar="colIndex">
                                <f:facet name="header">
                                    <h:outputText value="#{mycolHeader.value}" />
    
                                </f:facet>
                                <h:outputText value="#{result[mycolHeader.key].value}" />
                                <br />
                            </p:columns>
    
                        </p:dataTable>
                    </h:form>
    

    That's a example.

    0 讨论(0)
提交回复
热议问题