在数据表中Primefaces静态和dynamic列

我正在使用Primefaces 5.0创build一个dynamic数据表。

我的数据对象有一些必填字段和一个可选的“tupel”(键值对)列表。 可选列表的大小可能有所不同。 因此,我需要一个dynamic机制来显示Primefaces.DataTable中的DataObject列表。

我的方法如下所示:

public class DataObject { private String staticval1; private String staticval2; private List<Tupel> optionalValues; // .. getter, setter, hashCode, toString..... } public class Tupel{ private String id; private String value; } @ManagedBean @ViewScoped public class TableOverviewBean { private List<DataObject> data; @EJB private IMyDao myDao; @PostConstruct public void init() { data = myDao.findAll(); } public List<DataObject> getData() { return data; } public void setData(List<DataObject> data) { this.data = data; } } 
  <h:form> <p:dataTable value="#{tableOverviewBean.data}" var="data"> <p:column headerText="static1"> <h:outputText value="#{data.staticval1}" /> </p:column> <p:column headerText="static2"> <h:outputText value="#{data.staticval2}" /> </p:column> <p:columns value="#{data.optionalValues}" var="opt" headerText="#{opt.id}"> <h:outputText value="#{opt.value}" /> </p:columns> </p:dataTable> </h:form> 

但是这不起作用。 dynamic列不会呈现。 我该如何解决我的问题?

编辑:预期的结果:

 staticval1 | staticval2 | dynamic_id1 | dynamic_id2 | ... | dynmic_idn ---------------------------------------------------------------------- static1a | static2a | dyna_value1a| dyna_value2a | ... | dyna_valu3a static1b | static2b | dyna_value1b| dyna_value2b | ... | dyna_valu3b static1c | static2c | dyna_value1c| dyna_value2c | ... | dyna_valu3c 

根据行数据定义列是不可能的。 想象一下,第1行有2列,第2行有6列,第3行有1列,等等你怎么会产生一个技术上有效的HTML表格? 每一行必须具有相同数量的列。

你有两个select,取决于是否可以改变模型:

  1. 如果你不能改变模型,那么你需要用一个<p:column>replace<p:columns> ,并且使用例如<ui:repeat>的嵌套循环遍历#{data.optionalValues}或者也许甚至是另一个<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. 如果你可以改变模型,那么你需要让<p:columns value>指向一个bean属性,而不是指向一个行属性,这样对每一行都是一样的。 如果你用Map<String, Tupel> optionalValues了关键字Tupel#idList<String> Map<String, Tupel> optionalValues ,并将List<String>属性添加到包含所有可用的Tupel#id值的bean中,

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

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

////////////////////////////////////////////

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

这是一个例子。