2014-10-10 44 views
0

我有两个primefaces数据表A和B,目标是添加一个项目从A到B,所以我有两个ArrayList为每个数据表。 每个数据表有<p:ajax event="rowEditCancel" listener="#{item.onCancel}" update=":datatableA :datatableB" /> 侦听器被触发,并且数据表A中的对象被删除并添加到数据表B中,但数据表A中保留的项被复制,但是当我在该项中单击时,它会抛出NoRowAvailableExceptionPrimefaces JSF RowEditCancel事件重复从数据表中删除一行

这里是形式

<h:form id="formulario"> 
    <p:accordionPanel id="ap1">  
     <p:tab title="Examen">        
      <h:panelGrid columns="2" cellpadding="10">                                              
      </h:panelGrid>    
     </p:tab> 
     <p:tab title="Preguntas disponibles" id="tb2"> 
      <h:panelGroup id="pg2">   
       <p:dataTable id="dtDisponibles" value="#{examenPregunta.itemsDisponibles}" var="pregunta" 
          rows="10" paginator="true" 
          editable="true" 
          paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
          rowsPerPageTemplate="5,10,15" lazy="true" >       
         <f:facet name="header"> 
          <h:outputText value="Preguntas disponibles"/> 
         </f:facet> 


        <!--" <p:ajax event="rowEditCancel" listener="#{examenPregunta.agregarItem}" update="@form" />--> 

        <p:ajax event="rowEditCancel" listener="#{examenPregunta.agregarItem}" update=":formulario:ap1:dtSeleccionados :formulario:ap1:dtDisponibles /> 

         <p:column headerText="Clave" >        
          <h:outputText value="#{pregunta.identificador}"/> 
         </p:column>       

         <p:column headerText="Enunciado">        
          <h:outputText escape="false" value="#{pregunta.enunciado}"/> 
         </p:column> 
         <p:column>        
           <p:rowEditor />               
         </p:column> 
      </p:dataTable>     
     </h:panelGroup> 
    </p:tab> 

    <p:tab title="Preguntas seleccionadas" id="tab3"> 
     <h:panelGroup id="pg3"> 
      <p:dataTable id="dtSeleccionados" value="#{examenPregunta.itemsSeleccionados}" 
          editable="true" 
          var="pregunta" rows="10" paginator="true" 
          paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" 
          rowsPerPageTemplate="5,10,15" lazy="true" > 
         <f:facet name="header"> 
          <h:outputText value="Preguntas seleccionadas"/> 
         </f:facet> 

       <!--<p:ajax event="rowEditCancel" listener="#{examenPregunta.quitarItem}" update="@form" /> --> 

                             <p:ajax event="rowEditCancel" listener="#{examenPregunta.quitarItem}" update=":formulario:ap1:dtDisponibles :formulario:ap1:dtSeleccionados" /> 
         <p:column headerText="Clave" >        
          <h:outputText value="#{pregunta.identificador}"/> 
         </p:column> 


         <p:column headerText="Enunciado"> 
          <h:outputText escape="false" value="#{pregunta.enunciado}"/> 
         </p:column> 

         <p:column> 
          <p:rowEditor /> 
         </p:column> 

      </p:dataTable> 
     </h:panelGroup> 
    </p:tab> 

</p:accordionPanel> 
</h:form>    

这里是托管bean

@ManagedBean 
@SessionScoped 
public class ExamenPregunta implements Serializable { 
    private static final long serialVersionUID = 1L;  
    private Date currentDate = new Date(); 
    private String idExamen = ""; 
    private ITOAssessmentTest examen = null;  

    ITOAssessmentItem pregunta = new ITOAssessmentItem(); 
    ITOAssessmentItem[] arrPregunta = null; 

    private ArrayList<ITOAssessmentItem> itemsDisponibles = new ArrayList<ITOAssessmentItem>(); 
    private ArrayList<ITOAssessmentItem> itemsSeleccionados = new ArrayList<ITOAssessmentItem>(); 






    public void agregarItem(RowEditEvent event){ 
     System.out.println("agregarItem");   

     itemsDisponibles.remove((ITOAssessmentItem) event.getObject()); 
     itemsSeleccionados.add((ITOAssessmentItem) event.getObject()); 
    } 

    public void quitarItem(RowEditEvent event){    
     System.out.println("quitarItem");   
     itemsDisponibles.add((ITOAssessmentItem) event.getObject()); 
     itemsSeleccionados.remove((ITOAssessmentItem) event.getObject());   
    } 

    /** 
    * @return the itemsDisponibles 
    */ 
    public ArrayList<ITOAssessmentItem> getItemsDisponibles() { 
     return itemsDisponibles; 
    } 

    /** 
    * @return the itemsSeleccionados 
    */ 
    public ArrayList<ITOAssessmentItem> getItemsSeleccionados() { 
     return itemsSeleccionados; 
    } 

} 

在此先感谢!

+0

您是否明确地配置了JSF实现以忽略标记中的注释?如果你还没有,那里的** rowEditCancel事件定义将会被执行。 – kolossus 2014-10-12 17:26:27

回答

0

你的代码看起来没问题。

也许它是这个组合的错误accordionPanel-> datatable-> ajax-> rowEdit。

  <p:column> 
       <p:commandButton value="foo" action="#{examenPregunta.doAction(pregunta)}" 
        process="@this" 
        update=":formulario:dtDisponibles :formulario:dtSeleccionados"></p:commandButton> 
      </p:column> 

它为我工作。

你为什么有lazy =“true”?

+0

处理庞大的数据集...但我没有这样做 – 2014-10-12 02:55:48

+0

好吧,比你需要实现lazydatamodel。只有懒惰=“真”不起作用,没有任何影响 – user3424032 2014-10-12 14:16:41