0

私は次のように2つのモデルを持っています。

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

次の 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 は非常に優れた提案をしてくれましたが、実際には、どれもあなたが望むデータを提供しない可能性が高いです。したがって、3 番目の方法を提案します。ビューのニーズを考慮して、モデルを少し変更します。のすべての行がリストから現在反復さ<p:dataTable>れている要素で構成されており、その反復が唯一の反復であるため、これを行う必要があります。したがって、機能を実現するには、基本的にモデルのプレゼンテーションを変更することにより、反復要素内で必要なすべての行情報を提供する必要があります。

Countryアプローチの 1 つは、Stateオブジェクト (または表示する必要がある文字列プロパティ)を含む追加のクラスを作成することです。

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

国と州の両方のオブジェクトを含む 3 番目の Bean を作成することを提案できる 1 つの方法.どの国がどの州を持っているか知っている人はいますか? もう 1 つの方法は、Country を表示してからその国のすべての州を表示することですが、ここで DataTable を使用しているため、ルック アンド フィールが奇妙すぎます。なぜそれをやりたいのか、質問とともに自分の考えを説明するとよいでしょう。

于 2013-04-19T05:52:54.120 に答える