[英]Richfaces: rich:datatable rowspan using rich:subtable
[英]rich:datatable rowspan issue
我需要創建一個富:dataTable(甚至擴展),具有以下功能:
我有一個類公司有一個Product對象的集合。 我想顯示下表:
我仍然沒有弄清楚如何使用子表(在所有示例中,我發現subTable與主表具有完全相同的列)。 據推測,我需要在前兩列中使用rowpans,但我仍然沒有找到方法。
有人可以為此提供偽代碼嗎?
干杯!
更新1:我嘗試將左側列的行間距設置為列表或產品的大小,然后:
不幸的是,這對我不起作用,因為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 (構建組件樹時)創建了執行迭代的頁面。 我提供的解決方案有效,但有些事情是錯誤的,因為:
無論如何,對代碼。 我做的是這樣的(沒有測試下面的那個,但你會得到圖片。請注意,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.