【问题标题】:Howto directly edit in p:datatable如何在 p:datatable 中直接编辑
【发布时间】:2015-07-02 14:56:23
【问题描述】:

我使用 Primefaces 5.1。 我有一个数据表,想直接在单元格中进行编辑。 它有效,当我使用带有 p:rowEditor 的 editMode="row" 时,但我想要 在没有 rowEditor 的情况下直接在单元格中进行编辑。 机智的 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”模式下的表格 - 我没有收到任何事件。

最好的问候

【问题讨论】:

    标签: jsf-2 primefaces


    【解决方案1】:

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

    因此,在您的示例中,将 &lt;p:ajax event="rowEdit" ... /&gt; 替换为 &lt;p:ajax event="cellEdit" ... /&gt; 并检查您的 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 页)

    【讨论】:

    • remarkable... 在介绍中,OP 甚至谈到了 CellEditEvent :-) :"Wit editMode="cell" 我没有得到 CellEditEvent。这怎么可能?"
    猜你喜欢
    • 2018-05-02
    • 2014-09-30
    • 2017-01-16
    • 1970-01-01
    • 2019-11-21
    • 2010-11-27
    • 2016-04-26
    • 2015-01-21
    • 1970-01-01
    相关资源
    最近更新 更多