簡體   English   中英

rich:datatable rowspan問題

[英]rich:datatable rowspan issue

我需要創建一個富:dataTable(甚至擴展),具有以下功能:

我有一個類公司有一個Product對象的集合。 我想顯示下表:

替代文字

我仍然沒有弄清楚如何使用子表(在所有示例中,我發現subTable與主表具有完全相同的列)。 據推測,我需要在前兩列中使用rowpans,但我仍然沒有找到方法。

有人可以為此提供偽代碼嗎?

干杯!

更新1:我嘗試將左側列的行間距設置為列表或產品的大小,然后:

  • 如果產品是空的(公司還沒有產品),我打印兩列。 我通過將其呈現的屬性設置為#{myFuncs:sizeOf(company.products)}來有條件地執行此操作
  • 如果產品> = 1,那么我用它迭代它們 在該循環中,我插入兩列(一個用於產品名稱,一個用於描述),對於除第一個產品名稱列以外的每個產品名稱列,我將breakBefore屬性設置為#{!myFunc:firstProduct(company.products,product)} ,對於除第一個產品名稱之外的所有產品名稱,其評估結果為true。

不幸的是,這對我不起作用,因為a4j:repeat中的列根本沒有出現 - 不是因為渲染的標記。 循環是正確的,因為如果我打印標准文本,它會出現。

有沒有辦法實現行進,或者我是否在牆上敲我的頭?

更新2:該問題可能與本文有關 ,表明迭代組件(例如<a4j:repeat>)和標記<c:forEach>之間的差異。 第一個在渲染時發生,而第二個在渲染時運行,當JSF組件放在頁面的組件樹上時。

我試圖獲得富人:a4j之外的列:重復並且它們被渲染(當然,不像預期的那樣,但它們確實如此)。

你可以在沒有復雜的forEachs的情況下做到這一點。 您只需要利用subTable和rowKeyVar。

例如:

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

完美呈現給我。 請注意,我正在使用具有Jboss Extended EL的Seam,它允許我在集合上調用size()。 如果您不使用它,則可以使用prs:collectionSize()或fn:length()作為替代。

這也適用於Richfaces datascroller。

希望這可以幫助。

D.

遺憾的是,JSF UIData組件中沒有UIData支持。 最好的辦法就是在同一行顯示產品集合。 你可以使用另一個UIData組件迭代它,例如h:dataTable (渲染<table> ), t:dataList (渲染<ul> )或a4j:repeat (不渲染任何東西,你需要在每個項目之后使用例如<br/> )。

基於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,使其看起來像rowpans。

好的,基於上次更新,使用c:forEach (構建組件樹時)創建了執行迭代的頁面。 我提供的解決方案有效,但有些事情是錯誤的,因為:

  • 這需要花費太多時間(大約20家公司和200種產品需要大約3秒100%的CPU)。 我懷疑這是因為for c:forEach循環基本上構建了一個巨大的組件樹,它必須被渲染,而不是組件樹更小的初始方法。
  • 我想我將不得不為數據中的每次更改重新構建整個組件樹,而不是僅僅重新渲染它。

無論如何,對代碼。 我做的是這樣的(沒有測試下面的那個,但你會得到圖片。請注意,rich: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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM