Прайс-листы dataTable с rowspan
Я совершенно новый с JSF-сетями 3.1.
Я пытаюсь построить "сложную" таблицу, и я не могу найти хорошее решение, используя dataTable (мне нужен компонент сортировки).
Я хотел бы построить таблицу, эквивалентную следующему представлению HTML, используя базовое POJO, подобное этому:
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>
Я даю, может быть, слишком мало информации, поэтому, если вам это нужно, скажите мне:)
Надеюсь, что мой вопрос ясен.
Спасибо
Ответы
Ответ 1
Твердое твердое тело и все гибкое решение для пользовательских сеток - это использовать < c: forEach > вместе с Primefaces < p: panelGrid > :
<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>
Ответ 3
У меня была одна и та же проблема: простые (или богатые) интерфейсы предлагают rowspan только для верхнего и нижнего колонтитула.
Затем я попытался использовать компонент icefaces ace:datatable
, и он запускается добавлением только одного атрибута в colum (s), который вы хотите быть "доступным для строк": ace:column
: groupBy="#{bean.field}"
.
Вы указываете, как обычно, список строк, и этот компонент автоматически генерирует все строки в строке (я думаю, автоматически определяя значения соседних значений) в сгенерированной таблице html.
Он полностью работает с компонентами-перьями: в этот момент у меня есть производные метки в ледяных поверхностях datatable cells ant, которые ледяные поверхности, находящиеся в datatable, находятся внутри панели поверхностей.
Ответ 4
Я бы посмотрел на DataTable RichTaces. Я нашел его более гибким, чем таблица PrimeFaces для сложных макетов.
Вы можете использовать
<rich:collapsibleSubTable
value="#{bean.getData()}"
var="line"
id="subTable"
rowKeyVar="rowKey"
width="100%">
<rich:column width="40" 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
Важно, что если у вас есть кнопки/ссылки и т.д. в одном из столбцов rowspan, которые вы добавили rendered = "# {rowKey eq 0}", также!