簡體   English   中英

如何在單個行中顯示和選擇嵌套對象圖<p:dataTable>

[英]How to display and select a nested object graph in a single row of a <p:dataTable>

我有以下兩種模型。

Country

public class Country{
    private String countryName;
    private List<State> states;

    // Getters/setters.
}

State

public class State{
    private String stateName;
    private String stateCode;

    // Getters/setters.
}

在我的支持bean中,我有一個List<Country>屬性。

如何在<p:dataTable>顯示它,如下所示?

在此處輸入圖片說明

用戶選擇行后,如何獲取國家和州?

有兩種選擇:

  1. 嵌套數據表:只需在外部數據表的每一行的列中刪除另一個數據表:

     <p:dataTable var="country" value="#{myBean.countries}"> <p:column> <h:outputText value="#{country.name}"/> </p:column> <p:column> <p:dataTable var="state" value="#{country.states}"> <p:column> <p:outputText value="#{state.name}"/> </p:column> <p:column> <p:commandButton value="select"> <f:param name="state" value="#{state}"/> <f:param name="country" value="#{country}"/> </p:commmandButton> </p:column> </p:dataTable> </p:column> </p:dataTable> 
  2. Primefaces 可擴展行 :此IMO可縮放並看起來更好

      <p:dataTable var="country" value="#{myBean.countries}"> <p:column> <h:outputText value="#{country.name}"/> </p:column> <p:row expansion> <p:datalist value ="#{country.states} var="state"> #{state.name} </p:datalist> </p:row expansion> </p:dataTable> 

我可以建議您創建一個同時包含Country和State對象的Third Bean的方法。但是這里的問題是如何顯示Country然后在同一行中顯示狀態,因為這是一個Country有很多狀態。有人知道哪個國家有哪個州? 另一種方法是,您可以顯示“國家/地區”,然后顯示該國家/地區的所有州,但是它的外觀和感覺太怪異了,因為您在此處使用DataTable。 如果您也要回答自己的想法,為什么要這么做,那會很好。

Kolossus提出了非常好的建議,但實際上,它們極有可能無法為您提供所需數據的呈現。 因此,我提出了第三種方法:稍微修改模型以適應您的視圖需求。 這樣做是有必要的,因為<p:dataTable>每一行都由列表中當前迭代的元素組成,並且該迭代是唯一的迭代。 因此,為了實現您的功能,您應該通過基本修改模型表示來在迭代元素內提供所需的所有行信息。

一種方法是創建一個包含CountryState對象(或需要顯示的字符串屬性)的附加類:

public class CountryState {
    private Country country;
    private State state;
}

創建一個“即時”迭代列表(或預先選擇):

public List<CountryState> getCountryStates(List<Country> countries) {
    List<CountryState> lst = new ArrayList<CountryState>();
    for(Country country : countries) {
        for(State state : country.getState()) {
            lst.add(new CountryState(country, state);
        }
    }
    return lst;
}

並在您的數據表中使用它:

<p:dataTable value="#{bean.countryStates}" var="cs">
    <p:column headerText="Country name">  
        <h:outputText value="#{cs.country.name}" />  
    </p:column> 
    <p:column headerText="State name">  
        <h:outputText value="#{cs.state.name}" />  
    </p:column> 
    <p:column headerText="State code">  
        <h:outputText value="#{cs.state.code}" />  
    </p:column> 
</p:dataTable>

另外,如果要合並行/列,可以考慮使用<p:panelGrid>

暫無
暫無

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

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