2013-05-21 102 views
3

我有一個帶有在線編輯功能的數據表,我想通過將數據表應用於不同的樣式類來更新數據表以顯示修改後的記錄。單元編輯後的Primefaces更新表

這裏是我的問題:

  • 如果我不更新數據表時,onCellEdit事件觸發,記錄正確更新,但我看不到applyed風格類修改的行。
  • 如果我更新數據表時onCellEdit事件觸發並使用返回鍵來更新值,一切正常,我可以看到修改行的應用樣式類。
  • 如果我在on-cell編輯事件觸發時更新數據表並使用鼠標clic更新值(單擊另一行或同一行內的另一個單元格),則只會更新第一個值;當嘗試更新其他值時,onCellEdit事件會在我插入新值之前觸發,因此,對於所有後續更改,事件將以newValue = oldValue觸發。

XHTML頁面:

<h:form id="frm_tbl_riv"> 
    <p:dataTable id="tbl_rilevazioni" var="rilevazione" 
    value="#{rilevazioni.rilevazioni}" widgetVar="tbl_rilevazioni_id" 
    editable="true" editMode="cell" scrollable="true" scrollHeight="350" 
    rowKey="#{rilevazione.idRilevazione}" selectionMode="single" 
    selection="#{rilevazioni.selezionata}"> 
    <p:ajax event="rowSelect" 
     update=":tView:frm_tbl_riv:popup_rilevazioni" /> 
    <p:ajax event="cellEdit" listener="#{rilevazioni.onCellEdit}" 
     update=":tView:frm_btn_riv" /> 
     <!-- update=":frm_btn_riv :frm_tbl_riv" --> 
    <p:ajax event="contextMenu" 
     listener="#{rilevazioni.onRilevazioneSelezionata}" 
     update="@this" /> 

    <p:column headerText="#{msg['rilevazione']}" width="130"> 
     <f:facet name="header"> 
     <h:outputText value="#{msg['rilevazione']}" /> 
     </f:facet> 
     <h:outputText value="#{rilevazione.descRilevazione}" id="descRil" /> 
    </p:column> 
    <p:column headerText="#{msg['valore']}" 
     styleClass="#{rilevazioni.isModificata(rilevazione) ? 'modificata' : ''}" 
     width="30"> 
     <h:outputText value="#{rilevazione.valore}" 
     rendered="#{!rilevazioni.isModificabile(rilevazione)}" /> 
     <p:cellEditor 
     rendered="#{rilevazioni.isModificabile(rilevazione)}"> 
     <f:facet name="output"> 
      <h:outputText value="#{rilevazione.valore}" /> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="#{rilevazione.valore}" 
      label="#{msg['valore']}"> 
     </f:facet> 
     </p:cellEditor> 
    </p:column> 
    </p:dataTable> 
</h:form> 

和管理bean(查看作用域):

@ManagedBean(name = "rilevazioni") 
@ViewScoped 
public class GestioneRilevazioniBean implements Serializable 
{ 
    // ... 

    public void onCellEdit(CellEditEvent event) 
    { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    FacesMessage msg = null; 
    Object nuovoValore = event.getNewValue(); 
    Object vecchioValore = event.getOldValue(); 
    int i = event.getRowIndex(); 
    RilevazioneGiornaliera r = rilevazioni.get(i); 

    r.setIdUtente(userBean.getUserId()); 

    if (!nuovoValore.equals(vecchioValore)) 
    { 
     try 
     { 
     RilevazioniService.getInstance().updateRilevazioneGiornaliera(r); 
     modificate.add(r); 
     } catch (Throwable ex) 
     { 
     // ... 
     } 
    } 
    } 

    public boolean isModificata(RilevazioneGiornaliera riv) 
    { 
    return modificate.contains(riv); 
    } 

    public boolean isModificabile(RilevazioneGiornaliera rilevazione) 
    { 
    // some logic 
    return true; 
    } 
} 

如果我使用:

update=":frm_btn_riv :frm_tbl_riv" 

在電池上編輯事件,我獲得了在第2點和第3點指定的行爲。與一樣@form@ parent

回答

3

我已經創建了一個解決方案,在onCellEdit事件觸發後將樣式類更新爲修改後的單元格。

數據表:

<p:ajax event="cellEdit" listener="#{rilevazioni.onCellEdit}" 
    oncomplete="handleRilevazioniCellEdit(xhr, status, args);" /> 
// ... 
// within the cell editor 
<p:inputText id="rilevazioniCellEditInputtext" value="#{rilevazione.valore}" 
     label="#{msg['valore']}" /> 

使用Javascript:

<script> 
function handleRilevazioniCellEdit(xhr, status, args) 
{ 
    var modelInput = $('#parentId:' + args.rowIndex + '\\:rilevazioniCellEditInputtext'); 
    var cell = modelInput.parent().parent().parent(); 
    cell.addClass('modificata'); 
} 
</script> 

管理豆,在onCellEdit()事件的結束:

RequestContext requestContext = RequestContext.getCurrentInstance(); 
requestContext.addCallbackParam("rowIndex", event.getRowIndex()); 
相關問題