首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >显示一组数据表中的正确数据表

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

Stack Overflow用户
提问于 2012-02-17 05:04:41
回答 2查看 1.3K关注 0票数 0

参考primefaces论坛上的this帖子。

有人知道如何在同一页上使用多个数据表而只显示正确的数据表吗?

我的问题是我有一个视图作用域的bean,它的属性包含来自数据库中不同表的数据。对于每个数据库表的数据,我有多个数据表。现在,我想根据从<p:selectOneMenu>中选择的基础值(用红色圈起来)来显示数据表。

此屏幕截图将进一步解释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-17 07:36:04

基本方法是让表的rendered属性依赖于菜单的选定项。

代码语言:javascript
复制
<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依赖于所选的菜单项,并使用动态生成列。

代码语言:javascript
复制
<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>

使用类似这样的东西:

代码语言:javascript
复制
public void changeModel() {
    model = populateModelBasedOn(table);
    columns = populateColumnsBasedOn(table);
}

当您想要添加更多专门化的列时,这只允许较少的细粒度控制。您可能希望改为使用标记文件。

票数 2
EN

Stack Overflow用户

发布于 2012-02-22 23:43:08

依据上帝的恩典宣布。经过一番努力!我终于实现了!

为此,我要向BalusC的专家建议致以深深的感谢

所以我想和大家分享我的解决方案。

下面是我在xhtml文件中所做的:

代码语言:javascript
复制
<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中:

代码语言:javascript
复制
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团队,为我们提供了这样一个精彩的讨论平台!:-)

谢谢大家!:-)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9319034

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档