我在mybean中有一个HashMap:
private ArrayList<HashMap<String,Object>> searchResult;
我可以成功地从中显示数据:
<p:dataTable id="resultTable" var="result" value="#{myBean.searchResult}">
<p:column headerText="Name">
<h:outputText value="#{result.NAME}" />
</p:column>
<p:column headerText="Amount">
<h:outputText value="#{result.AMOUNT}" />
</p:column>
<p:column headerText="Date1">
<h:outputText value="#{result.DATE1}" />
</p:column>
<p:column headerText="Date2">
<h:outputText value="#{result.DATE2}" />
</p:column>
</p:dataTable>
问题是我不知道HashMap将拥有多少个键(DATE1,DATE2,... DATE N )。 如何使用所有值及其键作为标题创建这样的dataTable?
UPD。 比较下面的答案展示汽车,不同的是,汽车类具有品牌,年份,颜色等属性,但在我的情况下,你不知道所有列在执行之前。所以我略微修改了一个例子。也许有人会发现我的解决方案很有用
myForm.xhtml(与示例相同):
<p:dataTable id="searchResults" var="result" value="#{myBean.searchResult}">
<p:columns value="#{myBean.columns}" var="column" columnIndexVar="colIndex">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{result[column.property]}" />
</p:columns>
</p:dataTable>
myBean.java(ColumnModel与示例展示中的相同):
private ArrayList<HashMap<String,Object>> searchResult;
private List<ColumnModel> columns;
private void createColumns(ArrayList<String> selectedDates){
columns = new ArrayList<ColumnModel>();
columns.add(new ColumnModel("Name", "NAME"));
columns.add(new ColumnModel("Amount", "AMOUNT"));
for (int i = 0; i < selectedDates.size(); i++) {
columns.add(new ColumnModel(selectedDates.get(i), "DATE" + i));
}
setColumns(columns);
}
答案 0 :(得分:1)
您可以使用PrimeFaces ShowCase中描述的p:columns
组件:
<p:dataTable id="cars" var="car" value="#{dtColumnsView.cars}" widgetVar="carsTable" filteredValue="#{dtColumnsView.filteredCars}">
<p:columns value="#{dtColumnsView.columns}" var="column" columnIndexVar="colIndex" sortBy="#{car[column.property]}" filterBy="#{car[column.property]}">
<f:facet name="header">
<h:outputText value="#{column.header}" />
</f:facet>
<h:outputText value="#{car[column.property]}" />
</p:columns>
</p:dataTable>