Я должен создать rich:dataTable (или даже расширенный) со следующими функциями:
У меня есть класс Компания, имеющая набор объектов продукта. Я хочу показать следующую таблицу:
Я все еще не выяснил, как сделать это с подтаблицей (во всех примерах, я нашел, что подтаблица имеет те же самые столбцы как основная таблица). По-видимому, я должен играть с rowspans в первых двух столбцах, но я все еще не нашел путь.
Кто-то мог предоставить псевдокод для этого?
Удачи!
ОБНОВЛЕНИЕ 1: Я попробовал, устанавливает rowspan столбцов в левых как размер списка или продуктов, и затем:
К сожалению, это не работало на меня, потому что столбцы в a4j:repeat не появляются вообще - не из-за представленного тега. Цикл корректен, потому что, если я еще печатаю стандартный текст, это появляется.
Существует ли способ достигнуть rowspan, или я ударяю по голове на стене?
ОБНОВЛЕНИЕ 2: проблема, вероятно, связана с этой статьей, указав на различия между итеративными компонентами, такими как
Я пытался получить rich:columns вне a4j:repeat, и они представляются (конечно, не как ожидалось, но они делают).
Вы можете сделать это без этих сложных Foreach. Вам просто нужно воспользоваться субматурой и рябиком.
Например:
<rich:dataTable
value="#{backingBean.companyList}"
rows="100"
var="company">
<f:facet name="header">
<rich:columnGroup>
<rich:column>Company Name</rich:column>
<rich:column>Company Email</rich:column>
<rich:column>Product Name</rich:column>
<rich:column>Product Email</rich:column>
</rich:columnGroup>
</f:facet>
<rich:subTable value="#{company.products}" var="product" rowKeyVar="rowKey">
<rich:column rowspan="#{company.products.size()}" rendered="#{rowKey eq 0}">
#{company.name}
</rich:column>
<rich:column rowspan="#{company.products.size()}" rendered="#{rowKey eq 0}">
#{company.email}
</rich:column>
<rich:column>
#{product.name}
</rich:column>
<rich:column>
#{product.email}
</rich:column>
</rich:subTable>
</rich:dataTable>
делает идеально для меня. Обратите внимание, что я использую SHOS, который имеет JBoss Extended EL, который позволяет мне позвонить в размере () в коллекции. Если вы не используете это, вы можете использовать этот PRS: Collectionsize () или Fn: Длина () в качестве замены.
Это также красиво работает с DataScroller Richfaces.
Надеюсь, это поможет.
d.
К сожалению, в компонентах JSF Полупсевдо, основанное на основных компонентах JSF: Используйте CSS разумно, чтобы он выглядел как промежутки между строками. ОК, основываясь на последнем обновлении, создал страницу, выполняющую итерации, используя C: Foreach (при создании дерева компонентов). Решение, которое я предоставляю, но что-то чувствует себя неправильно об этом, потому что: В любом случае, к коду. Что я сделал, это что-то подобное (не проверили ни один ниже, но вы получите картину. Обратите внимание, что итерация внутри богатых: Datatable по существу игнорируется): UIData
нет поддержки rowspan. Лучшее, что вы можете сделать, - это просто отобразить коллекцию продуктов в той же строке . Вы можете перебирать его, используя другой компонент UIData
, например h: dataTable
(отображает
),
t: dataList
(отображает
) или
a4j: repeat
(ничего не отображает, вам нужно использовать, например,
после каждого элемента).
<h:dataTable value="#{bean.companies}" var="company">
<h:column>
<h:outputText value="#{company.name}" />
</h:column>
<h:column>
<h:outputText value="#{company.email}" />
</h:column>
<h:column>
<h:dataTable value="#{company.products}" var="product">
<h:column>
<h:outputText value="#{product.name}" />
</h:column>
</h:dataTable>
</h:column>
<h:column>
<h:dataTable value="#{company.products}" var="product">
<h:column>
<h:outputText value="#{product.description}" />
</h:column>
</h:dataTable>
</h:column>
</h:dataTable>
<rich:dataTable width="70%" id="applicantsTable" rows="100"
rowClasses="applicant_row" columnClasses="col"
value="#{backingBean.companyList}" var="company">
<f:facet name="header">
<rich:column>
<h:outputText styleClass="headerText" value="Company Name" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Company Email" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Product Name" />
</rich:column>
<rich:column>
<h:outputText styleClass="headerText" value="Product Email" />
</rich:column>
</f:facet>
<c:forEach items="#{backingBean.companyList}" var="c_company">
<c:if test="#{prs:collectionSize(c_company.products)> 0}">
<rich:column breakBefore="true"
rowspan="#{prs:collectionSize(c_company.products)}">
<h:outputText value="#{c_company.name}" />
</rich:column>
<rich:column
rowspan="#{prs:collectionSize(c_company.products)}">
<h:outputText value="#{c_company.email}" />
</rich:column>
<c:forEach items="#{c_company.products}" var="c_product">
<!-- This if clause is just to determine the breakBefore attribute -->
<c:if test="#{c_company.products[0] == c_product}">
<rich:column>
<h:outputText value="#{c_product.name}" />
</rich:column>
</c:if>
<c:if test="#{c_company.products[0] != c_product}">
<rich:column breakBefore="true" styleClass="internal_cell">
<h:outputText value="#{c_product.name}" />
</rich:column>
</c:if>
<rich:column styleClass="internal_cell">
<h:outputText value="#{c_product.email}" />
</rich:column>
</c:forEach>
</c:if>
</c:forEach>
Похожие вопросы: