2013-09-04 19 views
8

Mam datatable, który wyświetla różne podmioty na podstawie listy <>. Kiedy wybieram komórkę do edycji, chcę też móc uzyskać encję, aby ją zaktualizować. Oczywiście istnieje event.getRowIndex, którego mogę następnie użyć z listą <>, ale nie zawsze jest to wygodne. Czy istnieje inny sposób na pozyskanie istoty z CellEditEvent?PrimeFaces DataTable CellEdit uzyskać podmiot/obiekt

Odpowiedz

22

Jednym ze sposobów byłoby programowe EL-ocena bieżącego <p:dataTable var>.

Biorąc pod uwagę

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

można uzyskać w następujący sposób

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

inny sposób, jeśli nie jesteś zainteresowany w CellEditEvent argumentu byłoby zastąpić CellEditEvent argumentu zupełnie przekazując obecnie iterowana jednostka zamiast tego:

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

z

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

Należy pamiętać, że nie można utrzymać CellEditEvent i przekazać dodatkowe argumenty. Ta odpowiedź byłaby inaczej podana.

+0

Cóż, potrzebuję CellEditEvent, najwygodniej byłoby w jakiś sposób włączyć CellEdi tEvent jako argument wraz z podmiotem, jeśli to możliwe. W wyniku metody: public void onCellEdit (zdarzenie CellEditEvent, Entity entity). W przeciwnym razie prawdopodobnie pójdę pierwszą drogą. – ChrisGeo

+1

Nie można przekazać dodatkowych argumentów. Powiązane: http: // stackoverflow.com/questions/3909267/differences-between-action-and-actionlistener/3909382 # 3909382 Tak, tak, pierwszą drogą jest droga. Możesz w razie potrzeby ukryć ten kod na płycie głównej w metodzie użyteczności. Lub, jeśli używasz [biblioteki narzędzi JSF OmniFaces] (http://code.google.com/p/omnifaces/), po prostu użyj 'Entity entity = Faces.evaluateExpressionGet (" # {entity} ")'. – BalusC

6

mam zmaga się z tym problemem dwa i mi się nie podoba w zależności od nazwy var więc znalazłem to rozwiązanie:

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

uwagę, że jednostka jest zaktualizowany mogą być łączone bezpośrednio do DB, również nadal możesz uzyskać starą wartość. PS: dziękuję @BalusC za wszystko :)

0

Podobała mi się odpowiedź @ user1928596, więc rozszerzyłem ją nieco, aby uzyskać dokładny punkt danych reprezentowany przez komórkę i aktualizować tylko to. Spowoduje to powiązanie tekstu nagłówka kolumny danych z kodem zaplecza, ale nie znam lepszego sposobu, aby to zrobić.

To, co naprawdę mnie zaskoczyło, to fakt, że podczas edycji danych w zestawie danych zmieniają się również dane w komponencie bean. Nie potrzebuję cellEditEvent.getNewValue(), ponieważ dane w widoku są w jakiś sposób powiązane z danymi w komponencie bean. Myślałem, że to tylko wyświetlanie. Instrukcja log na końcu metody onCellEdit() miała pokazać stare i nowe wartości obiektu Event, ale pokazuje tylko nową wartość.

Oto komórki edycji DataTable:

DataTable

Oto kod display:

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

A metoda onCellEdit (który nazwałem 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(); 
} 
Powiązane problemy