0

我有两个模型如下。

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>的如下显示它?

在此处输入图像描述

一旦用户选择一行,我如何同时获得国家和州?

4

3 回答 3

2

有两种选择:

  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>
    
于 2013-04-19T06:24:27.690 回答
2

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>或者,如果您想合并行/列,您可以考虑使用。

于 2013-04-19T07:47:23.197 回答
1

我可以建议您创建一个包含 Country 和 State 对象的第三个 Bean 的一种方法..但是这里的问题是您如何在同一行显示 Country 然后状态,因为这里的问题是 A Country 有很多州..如何有人知道哪个国家有哪个州?另一种方式是您可以显示 Country 然后显示该国家/地区的所有州,但它的外观和感觉会太奇怪,因为您在这里使用 DataTable。如果你也用你的问题解释你的想法,你为什么要这样做,那将是很好的。

于 2013-04-19T05:52:54.120 回答