【问题标题】:Row selection with multiple p:dataTable具有多个 p:dataTable 的行选择
【发布时间】:2012-04-10 23:34:59
【问题描述】:

在以下场景中,我有几个迭代 ui:repeat 标记的数据表,我遇到了行侦听器为不在第一个表中的选定元素返回 null。

为了理解模型对象,我有几个菜单,每个菜单包含几个区域。

任何帮助将不胜感激。

下面的xhtml:

<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>

ListDataModel java实现:

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

}

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

【问题讨论】:

    标签: java primefaces xhtml


    【解决方案1】:

    我很高兴向您展示解决方案:将 ui:repeat 替换为另一个 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>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-26
      • 2016-03-27
      • 2015-02-14
      • 1970-01-01
      • 2021-10-06
      • 2016-10-07
      • 2013-09-25
      • 2022-08-17
      相关资源
      最近更新 更多