Heiko Wiesner
Heiko Wiesner

Reputation: 65

Howto directly edit in p:datatable

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

Answers (1)

Mathieu Castets
Mathieu Castets

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

Related Questions