如何在p:datatable中直接编辑

时间:2015-07-02 14:56:24

标签: jsf-2 primefaces

我使用的是Primefaces 5.1。 我有一个数据表,想直接在单元格中编辑。 它工作,当我使用editMode =“row”与p:rowEditor,但我想要 在没有rowEditor的单元格中直接编辑。 Wit editMode =“cell”我没有得到CellEditEvent。 怎么可能?

最好的问候

这是我的JSF页面:

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

您好, 我确实读过这本手册。 所以在cellEdit模式中查看我的数据表。

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

我的Bean方法没有得到事件

    public void authorityChanged(CellEditEvent e) {
    Object oldValue = e.getOldValue();

这是“cellEdit”模式中的表 - 我没有事件。

最好的问候

1 个答案:

答案 0 :(得分:1)

使用editMode="cell"时,您需要使用cellEdit事件而不是rowEdit。此外,您的ajax侦听器应该是具有以下签名的bean方法:public void onCellEdit(CellEditEvent event)

因此,在您的示例中,将<p:ajax event="rowEdit" ... />替换为<p:ajax event="cellEdit" ... />并检查您的bean方法

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);
    }
}

参考文献:PrimeFaces showcasePrimeFaces 5.1 User Guide(第163和171页)