rowEdit 在 dataTable Primefaces 上过滤行

rowEdit filtered rows on dataTable Primefaces

我正在使用 primefaces dataTable 和 rowEdit 事件来更改和保存我的 dataTable 中的值。当我编辑未过滤的行值时,效果很好,但是当我过滤值并尝试编辑时,编辑了错误的 ID。

例如: 我有一个包含 5 条记录的列表,ID 范围从 1 到 5。

我过滤列表以显示 id = 5 的记录,因此它只显示一行。 当我尝试编辑此记录时,我的 bean 正确获取了值,但对象的 id 不是 5,而是 1,在我应用过滤器之前它位于数据 table 的第一行。 如果我编辑过滤后的第二行 table,它会得到原始数据第二行的 idtable 没有过滤器。

屏幕:

<p:dataTable id="dataTable" var="linha" rowKey="#{linha.id}"
                            value="#{gestor.listaGestor}" editable="true"
                            draggableColumns="true" 
                            rendered="#{not empty gestor.listaGestor}"
                            widgetVar="tableGestor" filteredValue="#{gestor.filteredGestor}"
                            emptyMessage="Não existem registros." resizableColumns="true" styleClass="datatable_cadastro" liveResize="true">

                            <f:facet name="header">
                                Tabela Gestores
                                <p:commandButton id="toggler" type="button" value="Colunas" />
                                <p:columnToggler datasource="dataTable" trigger="toggler" />
                            </f:facet>

                            <p:ajax event="rowEdit" listener="#{gestor.onRowEdit}"
                                update=":edicao:msgs,:edicao:dataTable" />
                            <p:ajax event="rowEditCancel" listener="#{gestor.onRowCancel}"
                                update=":edicao:msgs" />

                            <p:column headerText="ID" sortBy="#{linha.id}" filterBy="#{linha.id}"
                                style="width:50px;">
                                <p:outputLabel value="#{linha.id}" style="width:100%" />
                            </p:column>
                            <p:column headerText="NOME" filterBy="#{linha.nome}"
                                filterMatchMode="contains" sortBy="#{linha.nome}"
                                style="width:100%;">
                                <p:cellEditor>
                                    <f:facet name="output">
                                        <h:outputText value="#{linha.nome.trim()}" />
                                    </f:facet>
                                    <f:facet name="input">
                                        <p:inputTextarea value="#{linha.nome}" id="nome"
                                            update=":edicao" style="width:100%" />
                                    </f:facet>
                                </p:cellEditor>
                            </p:column>
                            <p:column headerText="E-MAIL"
                                style="width:100%;" sortBy="#{linha.email}"
                                filterBy="#{linha.email}" filterMatchMode="contains">
                                <p:cellEditor>
                                    <f:facet name="output">
                                        <h:outputText value="#{linha.email.trim()}" />
                                    </f:facet>
                                    <f:facet name="input">
                                        <p:inputTextarea value="#{linha.email}" id="email"
                                            update=":edicao" />
                                    </f:facet>
                                </p:cellEditor>
                            </p:column>
                            <p:column headerText="ATIVO" style="width:150px;" filterBy="#{linha.ativo}" filterMatchMode="equals">
                                    <f:facet name="filter">
                                        <p:selectOneMenu onchange="PF('tableGestor').filter()" >
                                            <f:converter converterId="javax.faces.Character"/>
                                            <f:selectItem itemLabel="TODOS" itemValue=""/>
                                            <f:selectItem itemLabel="ATIVO" itemValue="T"/>
                                            <f:selectItem itemLabel="INATIVO" itemValue="F"/>
                                        </p:selectOneMenu>
                                    </f:facet>
                                    <p:cellEditor>
                                        <f:facet name="output">
                                            <p:selectBooleanCheckbox value="#{gestor.charToBool(linha.ativo)}" disabled="true"/> 
                                        </f:facet>
                                        <f:facet name="input">
                                            <p:selectBooleanCheckbox value="#{gestor.ativo}" id="ativo" immediate="true" update=":edicao" style="width:100%;"/>
                                        </f:facet>
                                    </p:cellEditor>    
                                </p:column>
                            <p:column headerText="!" style="width:40px">
                                <p:rowEditor/>
                            </p:column>
                            <p:column headerText="X" style="width:40px">
                                <p:commandLink styleClass="ui-icon ui-icon-trash"
                                    action="#{gestor.deletar(linha)}" update=":edicao" />
                            </p:column>

                        </p:dataTable>

Bean(onRowEdit):

    public void onRowEdit(RowEditEvent event){

        Object value = event.getObject();

        GestorVO gestorTela = (GestorVO) value;

        SimpleDateFormat dataHora = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

        FacesContext context = FacesContext.getCurrentInstance();

        if(gestorTela.getId() != null){

            if(ativo){
                gestorTela.setAtivo('T');
            } else {
                gestorTela.setAtivo('F');
            }

            GestorRN gestorRN = new GestorRN();
            GestorVO gestorAntes = gestorRN.getByPrimaryKey(gestorTela.getId());

            /** CONSISTENCIA DOS CAMPOS */

            /** IF CASO O CONTEUDO DOS CAMPOS SEJA NULO */
            if (gestorTela.getNome().trim().isEmpty() || gestorTela.getEmail().trim().isEmpty() ) {

                gestorTela.setNome(gestorAntes.getNome());
                gestorTela.setEmail(gestorAntes.getEmail());
                gestorTela.setAtivo(gestorAntes.getAtivo());

                context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração foi cancelada" ,"Nenhum campo pode estar vazio ou conter apenas espaço(s)." ));

            } else {
                /** IF CASO O CONTEUDO FOI SALVO MAS NÃO HOUVERAM ALTERAÇÕES NO REGISTRO */
                if (gestorAntes.getNome().trim().equals(gestorTela.getNome().trim()) 
                    && gestorAntes.getEmail().trim().equals(gestorTela.getEmail().trim())
                    && gestorAntes.getAtivo() == gestorTela.getAtivo() ) {

                    gestorTela.setNome(gestorAntes.getNome());
                    gestorTela.setEmail(gestorAntes.getEmail());
                    gestorTela.setAtivo(gestorAntes.getAtivo());

                    context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Alteração foi cancelada" ,"Não houve alteração no registro" ));
                }
                /** CASO O CONTEUDO TENHA SIDO REALMENTE ALTERADO, SALVA O CONTEUDO */
                else{
                    /** Realiza o trim para limpeza dos campos antes da gravação*/
                    gestorTela.setNome(gestorTela.getNome().trim());
                    gestorTela.setEmail(gestorTela.getEmail().trim());
                    gestorTela.setUsuarioAlteracao(loginRN.usuarioLogado().getNome());
                    gestorTela.setDataAlteracao(dataHora.format(new Date()));
                    /** Caso ocorra erros no método salvar, a tela retornará para os valores padrões antes da alteração */
                    boolean confirmacao = gestorRN.salvar(gestorTela);

                    if(!confirmacao) {
                        gestorTela.setNome(gestorAntes.getNome());
                        gestorTela.setEmail(gestorAntes.getEmail());
                        gestorTela.setAtivo(gestorAntes.getAtivo());
                    }
                }
            }
        } else {
            context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "ID do objeto Gestor não identificado" ,"Não foi possível identificar o ID do Gestor selecionado. Informe o ocorrido ao administrador do sistema" ));
        }
    }

当我使用@requestScoped bean 时,这发生在我身上。我切换到 @ViewScoped 并且它工作正常。