【问题标题】:PrimeFaces data table In-Cell Editing : I can't get the edited objectPrimeFaces 数据表内嵌编辑:我无法获取编辑的对象
【发布时间】:2013-11-17 12:54:45
【问题描述】:

我正在试验 DataTable - Cell Editing,如 PrimeFaces 展示中所示。由于这个问题,我修改了 Facelets 代码:primefaces in-cell-editing not update data in database,因为<p:ajax event="cellEdit"> 没有更新整个数据表。

<h:form id="form">            
    <p:outputPanel id="testContainer" deferred="true">   
        <p:growl id="messages" showDetail="true" />  
        <p:remoteCommand name="onCellEdit" action="#{articlesbean.onCellEdit()}" update=":form:messages" />
        <p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable" update=":cars">  
            <p:ajax event="cellEdit" oncomplete="onCellEdit()"  /> 
            ...
        </p:dataTable>  
    </p:outputPanel> 
</h:form>

远程命令动作方法定义如下:

public void onCellEdit(CellEditEvent event) {  
    Object oldValue = event.getOldValue();  
    Object newValue = event.getNewValue();  

    if(newValue != null && !newValue.equals(oldValue)) {  
        FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);  
        FacesContext.getCurrentInstance().addMessage(null, msg);  
    }  
}  

但是,此方法从未被调用,并引发以下异常:

javax.el.MethodNotFoundException: Method not found: com.pfe.controller.ArticlesBean@1bb3a11.onCellEdit()

当我删除 CellEditEvent 参数时,它就起作用了。但我实际上需要旧值和新值。我该如何继续?

【问题讨论】:

    标签: jsf jsf-2 primefaces celleditorlistener


    【解决方案1】:

    试试这个

     <p:ajax event="cellEdit" listener="#{orderDetailController.onCellEditTableComplete}" update=":formGeneral:tabViewGeneral:growl :formGeneral:tabViewGeneral:OrderHeaderTableComplete"/>
    
       <p:cellEditor>  
           <f:facet name="output"><h:outputText value="#{orderDetail.quantity}" /></f:facet>  
           <f:facet name="input">
                <p:inputText id="modelInput" value="#{orderDetail.quantity}" valueChangeListener="#{orderDetailController.onValueQuantityChange}"/></f:facet>  
       </p:cellEditor> 
    

    还有

    public void onValueQuantityChange(ValueChangeEvent event) {
        newQuantity = (Integer) event.getNewValue();
    }
    

    您将无法执行!newValue.equals(oldValue) 测试比较,但您将能够获得答案。

    public void onCellEditTableComplete(CellEditEvent event) {
        DataTable dataTable = (DataTable) event.getSource();
        OrderDetail oDetail = (OrderDetail) dataTable.getRowData();
        oDetail.setQuantity(newQuantity);
        ...
    }
    

    忘记p:remoteCommand,因为在p:dataTable 之外,你没有'想要的'CellEditEvent

    • 已编辑 -

    如果对于同一个表格,您必须在此单元格中显示一些计算,您应该从 p:remoteCommand 调用它。只需添加oncomplete="onCellEditTableComplete()" 并从表外进行更新

    <p:remoteCommand name="onCellEditTableComplete" update=":formGeneral:tabViewGeneral:OrderHeaderTableComplete " />
       <p:dataTable ...>
    
    
            <p:ajax event="cellEdit" listener="#{orderDetailController.onCellEditTableComplete}" 
                                    update=":formGeneral:tabViewGeneral:growl :formGeneral:tabViewGeneral:OrderHeaderTableResume" 
                                    oncomplete="onCellEditTableComplete()"/>
    

    【讨论】:

      【解决方案2】:

      尝试这样做:

      <h:form id="form">            
          <p:outputPanel id="testContainer" deferred="true">  
              <p:growl id="messages" showDetail="true" />  
              <p:remoteCommand name="onCellEdit" action="#{articlesbean.onCellEdit()}" update=":form:messages" />
              <p:dataTable id="cars" var="car" value="#{articlesbean.LMatpilotaccess1}" editable="true" editMode="cell" widgetVar="carsTable" update=":cars">  
                  <p:ajax event="cellEdit" oncomplete="onCellEdit()"  /> 
                  ...
              </p:dataTable>  
        </h:form>
      </p:outputPanel>
      

      []的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-27
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-16
        相关资源
        最近更新 更多