具有行跨度的 Primefaces 数据表

Posted

技术标签:

【中文标题】具有行跨度的 Primefaces 数据表【英文标题】:Primefaces dataTable with rowspan 【发布时间】:2012-10-19 19:43:27 【问题描述】:

我对 JSF primefaces 3.1 还是很陌生。 我尝试构建一个“复杂”表,但我找不到使用 dataTable 的好的解决方案(我需要一个排序组件)。

我想使用这样的基本 POJO 构建一个等效于以下 html 表示的表格:

String field1
String field2
List<String> fields3 // 3 items
String field4

<table border="1">
<tr>
    <td rowspan="3">col1</td>
    <td rowspan="3">col2</td>
    <td>col3.1</td>
    <td rowspan="3">col4</td>
</tr>
<tr>
    <td>col3.2</td>
</tr>
<tr>
    <td>col3.3</td>
</tr>       
</table>

我提供的信息可能太少,所以如果您需要,请告诉我:) 我希望我的问题很清楚。

谢谢

【问题讨论】:

行跨度真的有必要吗?你不能在嵌套表/列表中渲染fields3 吗? 是的,它可能是一个嵌套表/列表。我试过子表,但我不能在单元格中使用它:s 只需在fields3 属性上使用&lt;ui:repeat&gt; 【参考方案1】:

自定义网格的可靠且灵活的解决方案是将 与 Primefaces 一起使用:

<html ... xmlns:c="http://java.sun.com/jsp/jstl/core"
          xmlns:p="http://primefaces.org/ui">
    <p:panelGrid>
        <p:row>
            <p:column styleClass="ui-state-default" colspan="2"><!-- header -->
                <h:outputText value="Some Header"/>
            </p:column>
            ...
        </p:row>
        <p:row><!-- other header row -->
            ...
        </p:row>
        <c:forEach items="#list" var="element">
            <p:row>
                <p:column styleClass="ui-state-default" rowspan="#list.sublist.someSizeExpression"><!-- left rowspan -->
                    <h:outputText value="#element.name"/>
                </p:column>
                <c:forEach items="#element.sublist" var="subelement">
                    <p:column>
                        <h:selectBooleanCheckbox/>
                    </p:column>
                </c:forEach>
            </p:row>
        </c:forEach>
    </p:panelGrid>
</html>

看起来不错,Command-Buttons 和 AJAX 在 Head 和 Cells 中都可以使用。

【讨论】:

【参考方案2】:

因为您在标签中提到了primefaces。 我推荐你使用p:panelGrid

<p:panelGrid>  

    <p:row>  
        <p:column rowspan="3"/>  
        <p:column rowspan="3"/>  
        <p:column rowspan="1"/>  
        <p:column rowspan="3"/>  
    </p:row>  

    <p:row>  
        <p:column/>
    </p:row>  

    <p:row>  
        <p:column/>  
    </p:row>  

</p:panelGrid>

【讨论】:

是的,但是我需要对一些列进行排序,所以 dataTable 似乎是一个不错的选择。【参考方案3】:

我遇到了同样的问题:primefaces(或richfaces)只为页眉和页脚提供行跨度。

然后我尝试使用 icefaces ace:datatable 组件,它通过在列中添加一个您想要“行可扩展”的属性来运行:ace:columngroupBy="#bean.field"

你像往常一样给出一个行列表,这个组件会在生成的 html 表中自动生成所有行跨度(我认为是通过自动检测等于值的邻域)。

它与 primefaces 组件一起运行:此时我在 icefaces 数据表单元格中有 primefaces 输出标签,而这个 icefaces 数据表位于 primefaces 面板内。

【讨论】:

我终于实现了自己的表:s @Jean-FrançoisHouzard 对于像我这样具有此功能的人,您能否将您的解决方案发布为答案? RichFaces 确实支持行跨度!我们在一些带有子表的地方使用它。只要确保你使用了 render="#rowKey eq 0" rowspan="#bean.listSize"。你甚至可以有例如第一列的行跨度为 10,第二列的行跨度为 4 和 6(只是示例)。不过,您将需要第二列的另一个索引来进行渲染。【参考方案4】:

我会看看 RichFaces 数据表。对于复杂的布局,我发现它比 PrimeFaces 表更灵活。

你可以使用

 <rich:collapsibleSubTable
     value="#bean.getData()"
     var="line"
     id="subTable"
     rowKeyVar="rowKey"
     >
<rich:column  rendered="#rowKey eq 0" rowspan="#line.firstColRowSpan">
    #line.country
    </rich:column>
    <rich:column rendered="#line.index eq 0" rowspan="#line.secondColRowSpan">
       #line.state
    </rich:column>
    <rich:column>
    #line.city
    </rich:column>
</rich:subtable>

所以如果你的线数据看起来像这样:

US CA San Francisco 0 (index) 6 (firstColRowSpan) 3 (secondColRowSpan)
US CA LA 1 6 3
US CA Jose 2 6 3
US TX Huston 0 6 2
US TX Dallas 1 6 2
US AZ Phoenix 0 6 1
UK Surrey Guildford 0 1 1

表格会显示

US  CA     San Francisco
           LA
           Jose
    TX     Huston
           Dallas
    AZ     Phoenix 
UK  Surrey Guildford

重要的是,如果您在其中一个行跨列中有按钮/链接等,那么您也要在其中添加一个 render="#rowKey eq 0"!

【讨论】:

以上是关于具有行跨度的 Primefaces 数据表的主要内容,如果未能解决你的问题,请参考以下文章

当单元格具有行跨度和列跨度时,Chrome 表格出现故障

Vue.js - 具有两行跨度的组件

选择具有行跨度的表的第一列

调整primefaces数据表大小,实时滚动屏幕大小

vue.js 使用行跨度渲染表

如何使用 ExtJS Grid 4.1 制作具有行/列跨度的类表结构