参考primefaces论坛上的this帖子。
有人知道如何在同一页上使用多个数据表而只显示正确的数据表吗?
我的问题是我有一个视图作用域的bean,它的属性包含来自数据库中不同表的数据。对于每个数据库表的数据,我有多个数据表。现在,我想根据从<p:selectOneMenu>中选择的基础值(用红色圈起来)来显示数据表。
此屏幕截图将进一步解释。

发布于 2012-02-17 07:36:04
基本方法是让表的rendered属性依赖于菜单的选定项。
<p:selectOneMenu value="#{bean.table}">
<f:selectItem itemValue="players" itemLabel="Players" />
<f:selectItem itemValue="jobs" itemLabel="Jobs" />
<f:selectItem itemValue="business" itemLabel="Business" />
...
<p:ajax update="tables" />
</p:selectOneMenu>
<h:panelGroup id="tables">
<p:dataTable value="#{bean.players}" rendered="#{bean.table == 'players'}">
...
</p:dataTable>
<p:dataTable value="#{bean.jobs}" rendered="#{bean.table == 'jobs'}">
...
</p:dataTable>
<p:dataTable value="#{bean.business}" rendered="#{bean.table == 'business'}">
...
</p:dataTable>
...
</h:panelGroup>这很容易实现,但最终会在视图中包含大量代码(当然,这些代码可以拆分到<ui:include>文件中)。更高级和可重用的方法是让单个表的value依赖于所选的菜单项,并使用动态生成列。
<p:selectOneMenu value="#{bean.table}">
<f:selectItems value="#{bean.tables}" />
<p:ajax listener="#{bean.changeModel}" update="table" />
</p:selectOneMenu>
<p:dataTable id="table" value="#{bean.model}" var="item">
<p:columns value="#{bean.columns}" var="column">
<h:outputText value="#{item[column]}" />
</p:columns>
</p:dataTable>使用类似这样的东西:
public void changeModel() {
model = populateModelBasedOn(table);
columns = populateColumnsBasedOn(table);
}当您想要添加更多专门化的列时,这只允许较少的细粒度控制。您可能希望改为使用标记文件。
发布于 2012-02-22 23:43:08
依据上帝的恩典宣布。经过一番努力!我终于实现了!
为此,我要向BalusC的专家建议致以深深的感谢
所以我想和大家分享我的解决方案。
下面是我在xhtml文件中所做的:
<p:selectOneMenu value="#{dbmBean.selectedTable}" style="height:27px" >
<c:forEach items="#{dbmBean.tableNames}" var="table">
<f:selectItem itemLabel="#{table.value}" itemValue="#{table.key}"/>
</c:forEach>
</p:selectOneMenu>
<p:commandButton value="Go" action="#{dbmBean.goToTable}" ajax="false" />
...
<p:dataTable binding="#{dbmBean.table}" var="row" rowIndexVar="index">
<f:facet name="header"/>
<p:columns value="#{dbmBean.columns}" var="column" columnIndexVar="colIndex" >
<f:facet name="header">
#{column.header}
</f:facet>
<h:outputText value="#{row[column.property]}"/>
</p:columns>
</p:dataTable>在支持bean中:
public class DatabaseManagerBean implements Serializable {
private List<ColumnModel> columns; // Column model is a simple class with two string properties: header, property
...
public void goToTable() {
int tableIndex = new Integer(this.selectedTable);
switch (tableIndex) {
case 1:
Players tempPlayers = new Players(); //the class which get data from a database table
this.players = tempPlayers.getAllPlayers();
this.columnNames = tempPlayers.getColumnNames();
for (String colName : columnNames) {
columns.add(new ColumnModel(colName.toUpperCase(), colName));
}
table.setRendered(true);
table.setValue(this.players);
break;
...
default:
table.setRendered(false);
} //end of switch statement
} //end of goToTable() method
} //end of DatabaseManagerBean此代码片段将完全按照我在此屏幕截图中的预期工作!:-)

另外,如果有人发现了一些未解释或遗漏的东西,请写下评论。
再次向BalusC脱帽致敬。因为没有他的提示,我就不能实现这个目标。:-)
我还想说,感谢擎天柱和PrimeFaces团队创造了如此美妙的面孔。:-)
我也要感谢Stackoverflow团队,为我们提供了这样一个精彩的讨论平台!:-)
谢谢大家!:-)
https://stackoverflow.com/questions/9319034
复制相似问题