rich:datatable rowspan проблема

Я должен создать rich:dataTable (или даже расширенный) со следующими функциями:

У меня есть класс Компания, имеющая набор объектов продукта. Я хочу показать следующую таблицу:

alt text

Я все еще не выяснил, как сделать это с подтаблицей (во всех примерах, я нашел, что подтаблица имеет те же самые столбцы как основная таблица). По-видимому, я должен играть с rowspans в первых двух столбцах, но я все еще не нашел путь.

Кто-то мог предоставить псевдокод для этого?

Удачи!

ОБНОВЛЕНИЕ 1: Я попробовал, устанавливает rowspan столбцов в левых как размер списка или продуктов, и затем:

  • если продукты пусты (никакие продукты для компании все же), я печатаю два столбца. Я делаю это условно путем установки их представленного атрибута на # {myFuncs:sizeOf (company.products)}
  • Если продукты> = 1 затем, я выполняю итерации по ним с, и в том цикле я вставляю два столбца (один для названия продукта и один для описания), и для каждого столбца названия продукта кроме первого я установил атрибут breakBefore на # {! myFunc:firstProduct (company.products, продукт)}, который оценивает к истинному для всех названий продукта кроме первого.

К сожалению, это не работало на меня, потому что столбцы в a4j:repeat не появляются вообще - не из-за представленного тега. Цикл корректен, потому что, если я еще печатаю стандартный текст, это появляется.

Существует ли способ достигнуть rowspan, или я ударяю по голове на стене?

ОБНОВЛЕНИЕ 2: проблема, вероятно, связана с этой статьей, указав на различия между итеративными компонентами, такими как и тег . Первое происходит при рендеринге времени, в то время как второй работает ранее, когда компоненты JSF помещаются на дерево компонента страницы.

Я пытался получить rich:columns вне a4j:repeat, и они представляются (конечно, не как ожидалось, но они делают).

9
задан Markos Fragkakis 13 January 2010 в 01:32
поделиться

3 ответа

Вы можете сделать это без этих сложных 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.

6
ответ дан 3 November 2019 в 03:47
поделиться

К сожалению, в компонентах JSF UIData нет поддержки rowspan. Лучшее, что вы можете сделать, - это просто отобразить коллекцию продуктов в той же строке . Вы можете перебирать его, используя другой компонент UIData , например h: dataTable (отображает

), t: dataList (отображает
    ) или a4j: repeat (ничего не отображает, вам нужно использовать, например,
    после каждого элемента).

    Полупсевдо, основанное на основных компонентах JSF:

    <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>
    

    Используйте CSS разумно, чтобы он выглядел как промежутки между строками.

    2
    ответ дан 3 November 2019 в 03:47
    поделиться

    ОК, основываясь на последнем обновлении, создал страницу, выполняющую итерации, используя C: Foreach (при создании дерева компонентов). Решение, которое я предоставляю, но что-то чувствует себя неправильно об этом, потому что:

    • требуется слишком много времени (~ 3 секунды 100% процессор для около 20 компаний и 200 продуктов). Я подозреваю, что это связано с тем, что для COREACH COREACH для C: Foreach по существу строит огромное компонентное дерево, которое должно быть отображено вместо начальных подходов, где дерево компонентов было намного меньше.
    • Я думаю, что мне придется повторно построить все детали для каждого изменения данных, а не просто передать его.

    В любом случае, к коду. Что я сделал, это что-то подобное (не проверили ни один ниже, но вы получите картину. Обратите внимание, что итерация внутри богатых: 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>
    

    0
    ответ дан 3 November 2019 в 03:47
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: