2016-05-19 14 views
1

私はprimefacesをdatatableにしています。セル編集で特定の列または行全体を更新したいと思います。編集されたセルの値は、同じ行の他の列の値を決定します。Primefaces datatable、update row oncelledit

私はonCellEdit方法からコンポーネントが、ノー成功を更新しようとしました:

<p:column id="tgtType" styleClass="mapDetsTblColTypeTgt" headerText="Target Type"> 
    <p:cellEditor id="editor" rendered="..."> 
     <f:facet name="output"> 
      <h:outputText value="..." /> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="..." styleClass="mapDetsTblInput" onselect="this.value=this.value" /> 
     </f:facet> 
    </p:cellEditor> 
    <h:outputText value="..." rendered="!..."/> 
</p:column> 

任意のアイデア:

String targetTypeColumn = ((DataTable)event.getSource()).getClientId(FacesContext.getCurrentInstance()) + 
        ":" + event.getRowIndex() + ":editor"; 

RequestContext.getCurrentInstance().update(targetTypeColumn); 

列は、セルエディタを持っていますか?

これは時間の無駄ですので、私はdatatable全体を更新したくありません。

編集:

私は、セル編集

<p:dataTable id="mapperDetailsTable" styleClass="mapperDetailsTable" widgetVar="mapperDetailsTable" 
       ..... > 

       <p:ajax event="cellEdit" listener="#{bean.onCellEdit}" update=":mapperDetailsForm:growlMapper mapperDetailsTable" 
       oncomplete="handleCellEdit(args);" /> 
...... 

が、効果なしの時のデータテーブルを更新しようとしました。次のセルは更新されません。私は何を書きましたか?私は編集されたセルでautoCompleteを使っていますので、私は更新属性を持っていません。

<p:cellEditor rendered="#{guiUtils.isEditable(mapperCtrl, fieldMapping)}"> 
    <f:facet name="output"> 
     <h:outputText value="#{fieldMapping.fieldNameTgt}"/> 
    </f:facet> 
    <f:facet name="input"> 
     <p:autoComplete value="#{fieldMapping.fieldNameTgt}" completeMethod="#{mapperCtrl.dmUtils.completeTargetFields}" > 
      <p:ajax event="itemSelect" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/> 
      <p:ajax event="change" listener="#{mapperCtrl.action}" process="mapperDetailsTable"/> 
     </p:autoComplete> 
    </f:facet> 
</p:cellEditor> 

EDIT2:

私がチェックし、値がリスト内の正しい要素に更新されます。

私はこのスレッド(リロードデータテーブル)からソリューションを使用しました:Updating entire <p:dataTable> on complete of <p:ajax event="cellEdit"> すべてが問題ありません。値は正しく更新されますが、行やセルのみを更新する方法はありますか?

EDID 3:

私はボタン電池でクリックがリロードテーブルなしに更新された後、私はのcommandButton

<p:column> 
..... 
        <p:commandButton value="updateTgtRow" id="updateTgtRow" process="@this" ajax="true" immediate="true" update="outputType inputType"/> 
</p:column> 

を使用してセルを更新できることが分かりました。しかし、セル編集後にそのボタンをクリックする方法はありますか?私がoncompleteを追加したとき、セル編集は動作しません。セルは読み取り専用です。何か案が?

<p:ajax event="cellEdit" listener="#{mapperCtrl.onCellEdit}" 
        process="@this" oncomplete="#(updateTgtRow).click()"/> 
+1

特に 'cellEdit'イベント中の' update = "tableId"のデフォルト動作は、すでに現在の行だけを更新するということです。あなたは実際にそれを試してみましたか/調査しましたか?関連:http://stackoverflow.com/questions/19548838(実際には逆の方法を求めています) – BalusC

+0

@BalusC: 'cellEdit'のデフォルトは現在の**行**を更新することですか? (試していない、行とセルの編集を使用しないでください) – Kukeltje

+0

値はリストの正しい要素で更新されます。 – skoczo

答えて

1

私は、pを使用して私の問題を解決する:セルでcommandButtonコンポーネント

私はそれが他の細胞(outputTgtTypeとinputTgtType)からフィールドを更新

<p:commandButton style="display: none" value="updateTgtRow" id="updateTgtRow" process="@this" ajax="true" immediate="true" update="outputTgtType inputTgtType"/> 

を追加しました。 Bean iでそのボタンをクリックしてください。

String componentId = ((DataTable) event.getSource()).getClientId(FacesContext.getCurrentInstance()) + ":" 
         + event.getRowIndex() + ":updateTgtRow"; 

RequestContext.getCurrentInstance().execute("document.getElementById('" + componentId + "').click()"); 

ハックのようですが動作します。このソリューションは、現在編集されている行の特定のセルを更新します。

+0

ありがとう。それは私のユースケースにも役立ちました。 – Fritz

+0

これは、今後のPrimefacesリリースの機能要求として投稿する必要があると思います – Fritz

関連する問題