从一组数据表中显示正确的数据表

时间:2012-02-16 21:04:41

标签: jsf-2 primefaces

参考primefaces论坛上的this帖子 有人知道我们如何在同一页面上使用多个数据表,但只显示正确的数据? 我的问题是我有一个视图-Scoped bean,其属性包含来自数据库的不同表的数据。我有多个数据表用于每个数据库表的数据。现在我想在<p:selectOneMenu>选择的基础值上显示数据表(用红色环绕)。
这个截图将进一步解释。

image http://s19.postimage.org/qxugwevxf/image.jpg

2 个答案:

答案 0 :(得分:2)

基本方法是让表格的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:columns>动态生成列。

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

只要您想添加更专业的列,这只允许更细粒度的控制。您可能希望使用标记文件。

答案 1 :(得分:0)

靠着上帝的恩典。经过多次奋斗!我终于实现了 this ! 为此我向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

此代码段将完全按照我想要的截图工作! :-)

image http://s19.postimage.org/kt8xiy80z/image.png

如果有人发现无法解释或遗失的内容,请发表评论 再次向BalusC致敬。因为没有他的提示,我将无法实现这一目标。 :-)
我还要感谢Optimus Prime和PrimeFaces团队创造出如此精彩的Faces。 :-)
我还要感谢Stackoverflow团队为我们提供这样一个讨论的精彩平台! :-)
谢谢你们! : - )