Reputation: 65
i use Primefaces 5.1. I have a datatable and want to edit directly in the cells. It works, when i use editMode="row" with a p:rowEditor, but i want to edit directly in cells without the rowEditor. Wit editMode="cell" i get no CellEditEvent. How is that possible?
best regards
Here is my JSF Page:
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui"
template="${pageContext.request.contextPath}/templates/default.xhtml">
<ui:define name="content">
<h1>Hannymede Berechtigungsverwaltung</h1>
<p:panel header="Berechtigungsverwaltung">
<p:fieldset legend="Gruppe" style="margin-bottom:20px">
<h:form id="roleSelectorForm">
<p:selectOneMenu id="roleSelector" onchange="submit()"
value="#{authorityController.currentRole}"
converter="RoleConverter" hideNoSelectionOption="false">
<f:selectItem id="noRole" itemLabel="Gruppe auswählen"
itemValue="" noSelectionOption="true" />
<f:selectItems value="#{roleController.allRoles}" var="_role"
itemValue="#{_role}" itemLabel="#{_role.toString()}" />
</p:selectOneMenu>
</h:form>
</p:fieldset>
<p:fieldset legend="Berechtigungen der Gruppe"
style="margin-bottom:20px">
<h:form id="dataTableForm">
<p:dataTable id="authoritiesTable" editable="true" editMode="cell"
value="#{authorityController.currentRole.authoritys}" var="tw"
rowKey="#{tw.id} - #{tw.hashCode()}" rowIndexVar="rowIndex">
<p:ajax event="rowEdit"
listener="#{authorityController.authorityChanged}"></p:ajax>
<p:column sortBy="#{tw.voClassDesc.businessName}"
filterBy="#{tw.voClassDesc.businessName}">
<f:facet name="header">
<h:outputText value="Objekt" />
</f:facet>
<h:outputText value="#{tw.voClassDesc.businessName}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Lesen" />
</f:facet>
<p:cellEditor>
<f:facet name="input">
<p:selectBooleanCheckbox value="#{tw.autRead}" />
</f:facet>
<f:facet name="output">
<p:selectBooleanCheckbox value="#{tw.autRead}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Erstellen" />
</f:facet>
<p:cellEditor>
<f:facet name="input">
<p:selectBooleanCheckbox value="#{tw.autInsert}" />
</f:facet>
<f:facet name="output">
<p:selectBooleanCheckbox value="#{tw.autInsert}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Ändern" />
</f:facet>
<p:cellEditor>
<f:facet name="input">
<p:selectBooleanCheckbox value="#{tw.autUpdate}" />
</f:facet>
<f:facet name="output">
<p:selectBooleanCheckbox value="#{tw.autUpdate}" />
</f:facet>
</p:cellEditor>
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Löschen" />
</f:facet>
<p:cellEditor>
<f:facet name="input">
<p:selectBooleanCheckbox value="#{tw.autDelete}" />
</f:facet>
<f:facet name="output">
<p:selectBooleanCheckbox value="#{tw.autDelete}" />
</f:facet>
</p:cellEditor>
</p:column>
</p:dataTable>
</h:form>
</p:fieldset>
</p:panel>
</ui:define>
<ui:define name="title">Hannymede Berechtigungsverwaltung</ui:define>
</ui:composition>
Hello, I did read the manual. So looks my datatable in cellEdit Mode.
<p:dataTable id="authoritiesTable" editable="true" editMode="cell"
value="#{authorityController.currentRole.authoritys}" var="tw"
rowKey="#{tw.id} - #{tw.hashCode()}" rowIndexVar="rowIndex">
<p:ajax event="cellEdit"
listener="#{authorityController.authorityChanged}" update=":dataTableForm:authoritiesTable"></p:ajax>
and my Bean Method does not get the events
public void authorityChanged(CellEditEvent e) {
Object oldValue = e.getOldValue();
that's the table in "cellEdit" Mode - where i get no events.
best regards
Upvotes: 0
Views: 862
Reputation: 6040
When using editMode="cell"
you need to use the cellEdit
event instead of rowEdit
. In addition, your ajax listener should be a bean method with the following signature: public void onCellEdit(CellEditEvent event)
So in your example, replace <p:ajax event="rowEdit" ... />
by <p:ajax event="cellEdit" ... />
and check your bean method
public void authorityChanged(CellEditEvent event) {
Object oldValue = event.getOldValue();
Object newValue = event.getNewValue();
if(newValue != null && !newValue.equals(oldValue)) {
FacesMessage msg = new FacesMessage(FacesMessage.SEVERITY_INFO, "Cell Changed", "Old: " + oldValue + ", New:" + newValue);
FacesContext.getCurrentInstance().addMessage(null, msg);
}
}
References: PrimeFaces showcase and PrimeFaces 5.1 User Guide (pages 163 and 171)
Upvotes: 1