2013-09-04 2 views
8

リスト<に基づいてさまざまなエンティティを表示するデータテーブルがあります。編集用にセルを選択すると、エンティティを更新するために何らかの方法でエンティティを取得できるようにしたいと考えています。 もちろん、event.getRowIndexがあります。これはList <>で使用できますが、これは必ずしも便利ではありません。 CellEditEventからエンティティを取得する別の方法はありますか?PrimeFaces DataTable CellEditはエンティティ/オブジェクトを取得します

答えて

22

1つの方法は、現在のプログラムをEL評価することです。<p:dataTable var>

public void onCellEdit(CellEditEvent event) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    Entity entity = context.getApplication().evaluateExpressionGet(context, "#{entity}", Entity.class); 
    // ... 
} 

別の方法を次のようにCellEditEvent引数に興味を持っていないのであれば、あなたは、それを得ることができ

<p:dataTable value="#{bean.entities}" var="entity"> 

は、渡すことで完全にCellEditEvent引数を上書きすることです考えます代わりに引数として現在反復されているエンティティ:

<p:ajax event="cellEdit" listener="#{bean.onCellEdit(entity)}" /> 
public void onCellEdit(Entity entity) { 
    // ... 
} 

とあなたがCellEditEventを維持し、追加の引数を渡すことはできませんのでご注意ください。この答えは、そうでなければ明らかに与えられたでしょう。また、エンティティがDBに直接マージすることができ、更新されていることを

public void onCellEdit(CellEditEvent event) { 
    Entity entity =(Entity)((DataTable)event.getComponent()).getRowData(); 
} 

注:

+0

私はCellEditEventが必要です。最も便利なのは何とかCellEdi可能であれば、エンティティとともに引数としてのtEvent。メソッドの結果:public void onCellEdit(CellEditEventイベント、エンティティエンティティ)。そうでなければ、私はおそらく最初の方法で行くでしょう。 – ChrisGeo

+1

追加の引数を渡すことはできません。関連:http:// stackoverflow。com/questions/3909267/differences-actions-and-actionlistener/3909382#3909382はい、最初の方法は行く方法です。ボイラープレートコードを必要に応じてユーティリティメソッドに隠すことができます。または、[JSFユーティリティー・ライブラリーOmniFaces](http://code.google.com/p/omnifaces/)を使用する場合は、 'Entity entity = Faces.evaluateExpressionGet("#{entity} ")'を使用してください。 – BalusC

6

ので、私はこの解決策を見つけた私は、この問題は2で苦労されていると私はVAR名に依存好きではなかったですあなたはまだ古い価値を得ることができます。 PS:すべてのための@BalusCありがとう:)

0

私は@ user1928596の答えが好きだったので、セルで表された正確なデータポイントを取得してそれを更新するにはちょっと拡張しました。これは、データテーブルの列ヘッダーテキストをバックエンドコードに結合しますが、これを行うためのより良い方法はわかりません。

結果に本当に驚いたのは、データテーブル内のデータを編集すると、バッキングBeanのデータも同様に変更されるということです。私はcellEditEvent.getNewValue()は必要ありません。なぜなら、ビュー内のデータは何とかバッキングBeanのデータにバインドされているからです。私はそれがディスプレイ専用だと思った。 onCellEdit()メソッドの最後にあるlogステートメントは、Eventオブジェクトの古い値と新しい値を表示することを意図していましたが、新しい値のみを表示します。ここで

だセルが編集可能なデータテーブル:

<p:dataTable id="facilitatorAdminEvents" var="event" value="#{testBean.facilitatorEvents}" editable="true" editMode="cell"> 
      <p:ajax event="cellEdit" listener="#{testBean.editEvent}" update="facilitatorAdminEvents" /> 
     <p:column headerText="Event Name"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.name}"></h:outputText></f:facet><f:facet name="input"><p:inputText value="#{event.name}" style="width:100%" /></f:facet></p:cellEditor></p:column> 
     <p:column headerText="Start Date"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.startdate}"><f:convertDateTime pattern="M/d/yyyy" /></h:outputText> 
      </f:facet><f:facet name="input"><p:calendar id="eventStartdate" value="#{event.startdate}" effect="fold" /></f:facet></p:cellEditor> 
     </p:column> 
     <p:column headerText="End Date"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.enddate}"><f:convertDateTime pattern="M/d/yyyy" /></h:outputText> 
      </f:facet><f:facet name="input"><p:calendar id="eventEnddate" value="#{event.enddate}" effect="fold" /></f:facet></p:cellEditor> 
     </p:column> 
     <p:column headerText="Status"><p:cellEditor><f:facet name="output"><h:outputText value="#{event.status}" /></f:facet> 
      <f:facet name="input"> 
        <p:selectOneMenu id="eventstatuses" value="#{event.status}" style="width: 100%; margin: auto; " scrollHeight="80" showHeader="false" label="Statuses"> 
         <f:selectItems value="#{testBean.eventStatuses}" var="status" itemLabel="#{status}" /> 
        </p:selectOneMenu> 
      </f:facet></p:cellEditor> 
     </p:column> 
     <p:column id="delete" style="text-align: center; vertical-align: middle; min-width: 54px; "> 
      <p:commandButton update="facilitatorAdminEvents" icon="ui-icon-close" actionListener="#{testBean.deleteEvent(event.id)}"></p:commandButton> 
     </p:column> 
    </p:dataTable> 

と(私はeditEventの名前())onCellEdit方法:

public void editEvent(CellEditEvent cellEditEvent) { 
    Object newValue = cellEditEvent.getNewValue(); 
    String columnHeader = cellEditEvent.getColumn().getHeaderText(); 
    Event editedEvent = (Event) ((DataTable) cellEditEvent.getComponent()).getRowData(); 
    Event eventBeforeEdit = null; 
    for (Event thisEvent : events) { // Find this event in the list of cached events. 
     if (editedEvent.getId() == thisEvent.getId()) { 
      eventBeforeEdit = thisEvent; 
     } 
    } 
    log.info("Updating event " + eventBeforeEdit + " to " + editedEvent); 
    SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); 
    String update = null; 
    if ("Event Name".equals(columnHeader)) { 
     update = "update events set name = '" + newValue + "' where id = " + editedEvent.getId(); 
    } else if ("Start Date".equals(columnHeader)) { 
     update = "update events set startdate = '" + dateFormatter.format(newValue) + "' where id = " + editedEvent.getId(); 
    } else if ("End Date".equals(columnHeader)) { 
     update = "update events set enddate = '" + dateFormatter.format(newValue) + "' where id = " + editedEvent.getId(); 
    } else if ("Status".equals(columnHeader)) { 
     update = "update events set status = '" + newValue + "' where id = " + editedEvent.getId(); 
    } else { 
     log.error("Unrecognized value " + newValue + " encountered during event edit."); 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Event Save Failure:", "Apologies but we were unable to parse your entry " + newValue); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     return; 
    } 
    try { 
     mysqlNamedParameterJdbcTemplate.update(update, new HashMap<String, String>()); 
    } catch (DuplicateKeyException e) { // There may be an event with the same name. 
     FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Event Save Failure:", 
       "That name has already been used for an archived or logically deleted event. " + "Please use a different name for the new event to avoid confusion."); 
     FacesContext.getCurrentInstance().addMessage(null, message); 
     return; 
    } 
    log.info("Event " + eventBeforeEdit + " updated to " + editedEvent); 
    loadEvents(); 
} 

ここ

DataTable

が表示コードです

関連する問題