2012-11-30 51 views
6

这里是我的模型:如何在Primefaces数据表中表示嵌套数据?

User.java

public class User { 
    //... 

    public List<User> getFriends() { 
     // ... 
    } 
} 

我想建的用户朋友们的表是这样的:

users.jsf

 
+----------+------------+ 
| USER | FRIENDS | 
+----------+------------+ 
|   | ALICE | 
|   +------------+   
| ADAM | BOB  | 
|   +------------+ 
|   | PITT | 
+----------+------------+ 
|   |   | 
.... 

由于有很多用户,这是不可能的转储ŧ他用户表一气呵成。

数据表部件是在这种情况下,理想的,因为它有内置的分页支持。 它也是理想的,因为它可以对列进行排序...

不幸的是,我无法通过Primefaces示例找到更改用户列中rowspan的方法。

我怎样才能建立这个数据表?

有这种类似的问题,其他一些OP:

编辑
这里是the final solution I came up

回答

0

基于@凯雷姆的答案,这里是我想出了一个解决方案:

为了使嵌套确定年代一样主数据表中的自己行,我已经重写了CSS类.ui-dt-c。检查h:head有关详细信息,style标签。

<?xml version="1.0" encoding="UTF-8"?> 
<html 
    xmlns="http://www.w3c.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:ui="http://java.sun.com/jsf/facelets"> 
<h:head> 
    <title>USERS and their friends</title> 
    <style> 
     .ui-dt-c { 
      padding: 0px !important; 
     } 
    </style> 
</h:head> 
<h:body> 
<h:form id="form"> 
<p:dataTable 
    value="#{users.list}" 
    var="u"> 

    <p:columnGroup type="header"> 
     <p:row> 
      <p:column headerText="USER" /> 
      <p:column headerText="FRIENDS" /> 
     </p:row> 
    </p:columnGroup> 

    <p:column>#{u.name}</p:column> 
    <p:column> 
     <p:dataTable 
      value="#{u.friends}" 
      var="f"> 
      <p:column>#{f.name}</p:column> 
     </p:dataTable> 
    </p:column> 
</p:dataTable> 
</h:form> 
2

Primefaces expandable rows应该满足您的需要,只有你需要发挥创意与子行的组成部分。您可以使用主要面data list component作为子行组件。它会是这个样子:

<p:row expansion> 
    <p:datalist value ="#{yourTableRowVar.friendslist} Var="friend"> 
    #{friend.firstName} 
    </p:datalist> 
    </p:row expansion> 
12

只需使用你的专栏:)

<h:column> 
    <h:dataTable var="friend" value="#{user.friends}"> 
     <h:column> 
      <h:outputText value="#{friend.name}"/> 
     </h:column> 
    </h:dataTable> 
</h:column> 

这是它的外观在我的本地内的另一个数据表

enter image description here

3

另一种选择是使用ui:repeat列内获取集合的所有值。

例子:

<p:dataTable var="user" value="#{userGroupBacking.users}" id="userTable"> 

    <p:column headerText="User"> 
     <h:outputText value="#{user.name}" /> 
    </p:column> 

    <p:column headerText="Groups"> 
     <ui:repeat var="group" value="#{user.groups}"> 
      <h:outputText value="#{group.name}" /><br /> 
     </ui:repeat> 
... 
1

对我来说有两个解析:

1 - 如果我想通过用户浏览用户和检索的朋友列表,在这种情况下,我更喜欢DataList控件

<p:dataTable value="#{users.list}" var="u"> 

    <p:column headerText="USER">#{u.name}</p:column>  
    <p:column headerText="FRIENDS"> 
     <p:dataList value="#{u.friends}" var="f"> 
      #{f.name} 
     </p:dataTable> 
    </p:column> 

</p:dataTable> 

2-在其中i可直接处理的朋友(listFreinds [用户名,朋友]),或者当列表中的情况下,我使用JPQL查询

<p:dataTable value="#{users.listFreinds}" var="u" sortBy="#{u.userName}"> 

    <p:column headerText="USER" groupRow="true">#{u.userName}</p:column>  
    <p:column headerText="FRIENDS">#{u.friend}</p:column> 

</p:dataTable> 

的第二种情况下,与Primefaces行分组因为v6.0.11一个新的本地溶液

https://www.primefaces.org/showcase/ui/data/datatable/rowGroup.xhtml

+1

你能举例说明你的答案吗? – Stephan