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
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.
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 :)
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:
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();
}
- 1. Primefaces DataTable nieprawidłowo sortuje
- 2. Zdarzenie RowSelect - Primefaces - dataTable
- 3. Primefaces dataTable with rowspan
- 4. PrimeFaces DataTable scrollBar
- 5. Jak zaktualizować określony wiersz w Primefaces, którego datatable
- 6. Primefaces: ustaw stronę na datatable
- 7. Jak uzyskać wartości wprowadzone w polu Filtered DataTable of Primefaces?
- 8. Zmiana szerokości filtr InputBox primefaces DataTable
- 9. Primefaces Lazy Ładowanie żadnych danych w datatable
- 10. PrimeFaces dataTable pasek przewijania w żądanej pozycji
- 11. Jak działa filterMatchMode z PrimeFaces DataTable?
- 12. Resetowanie stanu PrimeFaces DataTable (filtrowanie, sortowanie, stronicowanie)
- 13. Warunkowa edycja komórki w elementach PrimeFaces datatable
- 14. Primefaces DataTable, leniwy załadunku i CommandButton za rzędzie
- 15. Primefaces - Nie można znaleźć składnika z identyfikatorem poza DataTable
- 16. Jak korzystać z PrimeFaces p: droppable inside datatable?
- 17. Jak przekonwertować PrimeFaces p: dataTable na standardowy h: dataTable (bez skóry), a następnie wydrukować go
- 18. Dynamicznie twórz okna dialogowe PrimeFaces
- 19. Row numeracji z p: dataTable
- 20. Zamrożenie kolumny lub stała kolumna w datatable
- 21. uzyskać indeks DataTable kolumnie z nazwą
- 22. Jak uzyskać datatable w wyniku procedury przechowywanej
- 23. Jak uzyskać SqlType kolumny w DataTable?
- 24. Jak reprezentować zagnieżdżone dane w datacable Primefaces?
- 25. primefaces panelgrid colspan nie działa
- 26. Jak pobrać prezentację PrimeFaces?
- 27. Jak wyszukiwać dane dla Primefaces dataTable za pomocą leniwego ładowania i stronicowania
- 28. Czy Primefaces może uzyskać jquery z innej domeny?
- 29. Nie można uzyskać PrimeFaces RequestContext.getCurrentInstance(). OpenDialog() do pracy
- 30. primefaces globalny filtr bez filtrów kolumnowych
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
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