2012-03-27 7 views
1

次のシナリオでは、ui:repeatタグで繰り返し処理を行うdataTablesがある場合、最初のテーブルにない選択された要素に対してnullを返すことがあります。複数のpを持つ行選択:dataTable

モデルオブジェクトを理解するために、いくつかのメニューがあり、それぞれにはいくつかの領域があります。

ご協力いただければ幸いです。 UIを置き換えます:別のpで繰り返します。Bean内の

<ui:repeat value="#{someBean.menus}" var="menu">     

    <p:dataTable var="area" value="#{menu.areas}" 
     rowKey="#{area.id}" selection="#{menu.area}" selectionMode="single"> 

     <p:ajax event="rowSelect" listener="#{someBean.rowSelected}" /> 

     <f:facet name="header">#{menu.name}</f:facet> 

     <p:column> 
      <f:facet name="header"></f:facet> 
      <h:outputText value="#{area.id}" /> 
     </p:column> 

     <p:column> 
      <f:facet name="header">Area name</f:facet> 
      <h:outputText value="#{area.name}" /> 
     </p:column> 

    </p:dataTable> 

</ui:repeat> 

public class Areas extends ListDataModel<Area> implements SelectableDataModel<Area>, Serializable { 

    private static final long serialVersionUID = -9102592194300556930L; 

    public Areas() { 
    } 

    public Areas(List<Area> data) { 
     super(data); 
    } 

    @Override 
    public Area getRowData(String rowKey) { 
     @SuppressWarnings("unchecked") 
     List<Area> areas = (List<Area>)getWrappedData();   
     for (Area area : areas) { 
      if (String.valueOf(area.getId()).equals(rowKey)) { 
       return area; 
      } 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(Area area) { 
     return area.getId(); 
    } 

} 



public class Menus extends ListDataModel<Menu> implements SelectableDataModel<Menu>, Serializable { 

    private static final long serialVersionUID = -4079772686830676202L; 

    public Menus() { 
    } 

    public Menus(List<Menu> data) { 
     super(data); 
    } 

    @Override 
    public Menu getRowData(String rowKey) { 
     @SuppressWarnings("unchecked") 
     List<Menu> menus = (List<Menu>)getWrappedData();   
     for (Menu menu : menus) { 
      if (String.valueOf(menu.getId()).equals(rowKey)) { 
       return menu; 
      } 
     } 
     return null; 
    } 

    @Override 
    public Object getRowKey(Menu menu) { 
     return menu.getId(); 
    } 

} 

は...私はあなたに解決策を示して嬉しい

public void rowSelected(SelectEvent event) { 
    Area selectedArea = (Area)event.getObject(); //This, is null for other tables except the first 
    System.out.println("SELECTED AREA:" + selectedArea); 
    //... 
} 

答えて

0

をsomeBeanのdataTable !!!

<p:dataTable value="#{someBean.menus}" var="menu"> 

    <p:column>     

     <p:dataTable var="area" value="#{menu.areas}" 
      rowKey="#{area.id}" selection="#{menu.area}" selectionMode="single"> 

      <p:ajax event="rowSelect" listener="#{someBean.rowSelected}" /> 

      <f:facet name="header">#{menu.name}</f:facet> 

      <p:column> 
      <f:facet name="header"></f:facet> 
      <h:outputText value="#{area.id}" /> 
      </p:column> 

      <p:column> 
      <f:facet name="header">Area name</f:facet> 
      <h:outputText value="#{area.name}" /> 
      </p:column> 

     </p:dataTable> 

    </column> 

</p:dataTable> 
関連する問題