2013-09-04 49 views
8

Tôi có một dữ liệu có thể hiển thị các thực thể khác nhau dựa trên Danh sách <>. Khi tôi chọn một ô để chỉnh sửa, tôi muốn có thể nhận được thực thể bằng cách nào đó để cập nhật nó. Tất nhiên có event.getRowIndex, sau đó tôi có thể sử dụng với Danh sách <>, nhưng điều đó không phải lúc nào cũng thuận tiện. Có lẽ một cách khác để có được thực thể từ CellEditEvent?PrimeFaces DataTable CellEdit nhận đối tượng/đối tượng

Trả lời

22

Một cách để lập trình EL đánh giá hiện tại <p:dataTable var>.

Cho một

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

bạn có thể nhận được nó như sau

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

Một cách khác, nếu bạn không quan tâm đến đối số CellEditEvent, sẽ được ghi đè lên các tranh cãi CellEditEvent hoàn toàn bằng cách đi qua đối tượng hiện được lặp lại làm đối số thay thế:

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

với

public void onCellEdit(Entity entity) { 
    // ... 
} 

Xin lưu ý rằng bạn không thể giữ CellEditEvent và chuyển các đối số bổ sung. Câu trả lời này nếu không rõ ràng sẽ được đưa ra.

+0

Vâng tôi cần CellEditEvent, thuận tiện nhất sẽ bằng cách nào đó cũng bao gồm CellEdi tEvent như một đối số cùng với một thực thể nếu có thể. Kết quả trong một phương thức: public void onCellEdit (CellEditEvent event, Entity entity). Khác tôi có lẽ sẽ đi theo con đường đầu tiên. – ChrisGeo

+1

Bạn không thể chuyển đối số bổ sung. Liên quan: http: // stackoverflow.com/questions/3909267/sự khác biệt giữa hành động-và-actionlistener/3909382 # 3909382 Vì vậy, có, cách đầu tiên là con đường để đi. Bạn có thể nếu cần thiết ẩn mã boilerplate đi vào một phương pháp tiện ích. Hoặc, nếu bạn tình cờ sử dụng [Thư viện tiện ích JSni OmniFaces] (http://code.google.com/p/omnifaces/), chỉ cần sử dụng 'Entity entity = Faces.evaluateExpressionGet (" # {entity} ")'. – BalusC

6

tôi đã phải vật lộn với vấn đề này hai và tôi không thích phụ thuộc tên var vì vậy tôi tìm thấy giải pháp này:

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

lưu ý rằng các thực thể được cập nhật có thể được sáp nhập trực tiếp vào DB, cũng bạn vẫn có thể nhận được giá trị cũ. PS: cảm ơn bạn @BalusC cho mọi thứ :)

0

Tôi thích câu trả lời của @ user1928596 vì vậy tôi đã mở rộng nó một chút để có được điểm dữ liệu chính xác được biểu thị bằng ô và chỉ cập nhật điều đó. Điều này không cặp văn bản tiêu đề cột có thể định datatable vào mã phụ trợ nhưng tôi không biết cách nào tốt hơn để làm điều này.

Điều khiến tôi ngạc nhiên về kết quả là khi tôi chỉnh sửa dữ liệu trong dữ liệu có thể đặt, dữ liệu trong bean sao lưu cũng được thay đổi. Tôi không cần cellEditEvent.getNewValue() vì dữ liệu trong khung nhìn bị ràng buộc bằng cách nào đó với dữ liệu trong bean sao lưu. Tôi nghĩ nó chỉ hiển thị. Câu lệnh log ở cuối phương thức onCellEdit() được dự định để hiển thị các giá trị cũ và mới cho đối tượng Event nhưng nó chỉ hiển thị giá trị mới.

Dưới đây là các tế bào có thể chỉnh sửa DataTable:

DataTable

Dưới đây là đoạn mã hiển thị:

<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> 

Và phương pháp onCellEdit (mà tôi đặt tên editEvent()):

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(); 
} 
Các vấn đề liên quan