2012-02-17 63 views
4

我想有客户端分组预订表。从这张表格中,用户可以选择多个预订进行结算。所以我试图使用SubTable进行分组,但是,我不确定如何实现选择功能。显然,子表不允许选择属性,如果我在父DataTable上设置选择属性,我不知道如何选择rowKey。Primefaces数据表与子表和多重选择

这是我的尝试:

java.lang.NullPointerException 
    java.lang.reflect.Array.newArray(Native Method) 
    java.lang.reflect.Array.newInstance(Array.java:52) 
    org.primefaces.component.datatable.DataHelper.decodeMultipleSelection(DataHelper.java:238) 
    org.primefaces.component.datatable.DataHelper.decodeSelection(DataHelper.java:224) 
    org.primefaces.component.datatable.DataTableRenderer.decode(DataTableRenderer.java:64) 
    javax.faces.component.UIComponentBase.decode(UIComponentBase.java:787) 
    javax.faces.component.UIData.processDecodes(UIData.java:1162) 
    org.primefaces.component.datatable.DataTable.processDecodes(DataTable.java:531) 
    javax.faces.component.UIForm.processDecodes(UIForm.java:225) 
    javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) 
    javax.faces.component.UIComponentBase.processDecodes(UIComponentBase.java:1176) 
    javax.faces.component.UIViewRoot.processDecodes(UIViewRoot.java:933) 
    com.sun.faces.lifecycle.ApplyRequestValuesPhase.execute(ApplyRequestValuesPhase.java:78) 
    com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
    com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:409) 

用来支持与子表数据表多重选择:

<p:dataTable style="border: 0px;" value='#{clientController.allClients}' 
      var='client' rowKey="#{item.id}" selectionMode="multiple" 
      selection="#{bookingController.bookingsToBill}"> 
    <p:subTable value='#{client.billableBookings}' var='item'> 
    <f:facet name="header"> 
     <h:outputText style="font-weight:bold;" value="#{client.name}" /> 
    </f:facet> 
    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Booking"/> 
     </f:facet> 
     <h:outputText value="#{item.title}"/> 
    </p:column> 
    </p:subTable> 
</p:dataTable> 

那么,这个提交选择时会导致下面的错误?如果是这样,怎么做对不对?如果不是,你会建议如何达到类似的结果?

我使用:Primefaces 3.1.1 - 钻嘴鱼科JSF 2.1 - Tomcat的6.0.14

回答

1

你有没有分析了Primefaces'橱窗描述this solution

它基本上可以归结为这样:

<p:dataTable style="border: 0px;" value='#{clientController.allClients}' 
      var='client' rowKey="#{item.id}" 
      selection="#{bookingController.bookingsToBill}" > 
<p:subTable value='#{client.billableBookings}' var='item'> 
    <f:facet name="header"> 
     <h:outputText style="font-weight:bold;" value="#{client.name}" /> 
    </f:facet> 
    <p:column selectionMode="multiple" /> 
    <p:column> 
     <f:facet name="header"> 
      <h:outputText value="Booking"/> 
     </f:facet> 
     <h:outputText value="#{item.title}"/> 
    </p:column> 
</p:subTable> 

或者尝试用AJAX事件监听器,绑定到您的BookingController:

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

,并更新自己选择的产品清单在这两个功能:

List<Booking> selectedBookings = new ArrayList<>(); 
... 
public void rowSelected(SelectEvent event) { 
    Booking book = (Booking) event.getObject(); 
    selectedBookings.add(book); 
} 

public void rowUnselected(UnselectEvent event) { 
    Booking book = (Booking) event.getObject(); 
    selectedBookings.remove(book); 
} 

这不是很优雅,但它带给我的逻辑让这个默默无闻的NullPointerException异常后,开始工作。

+0

JFS,为你做这个解决方案的工作? – JackDev 2012-10-02 02:34:14

+0

相关主题http://forum.primefaces.org/viewtopic.php?f=3&t=18502 – JackDev 2012-10-02 02:45:58