2012-03-27 13 views
1

In dem folgenden Szenario, in dem ich mehrere dataTables habe, die Iteration über ein ui: repeat-Tag erstellen, habe ich festgestellt, dass der Zeilen-Listener null für ausgewählte Elemente zurückgibt, die nicht in der ersten Tabelle enthalten sind.Zeilenauswahl mit mehreren p: dataTable

Um das Modellobjekt zu verstehen, habe ich mehrere Menüs, und jedes von ihnen enthält mehrere Bereiche.

Jede Hilfe wird sehr geschätzt.

<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(); 
    } 

} 

... in der Bohne someBean

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); 
    //... 
} 

Antwort

0

Ich bin froh, dass Sie die Lösung zeigen: ui ersetzen: repeat mit einem anderen p: 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> 
Verwandte Themen