dataEable Primefaces上的rowEdit过滤行

时间:2015-05-15 19:35:48

标签: jsf jsf-2 primefaces datatable

我使用primefaces dataTable和rowEdit事件来更改和保存dataTable中的值。当我编辑未经过滤的行值时,它运行良好,但是当我过滤值并尝试编辑时,会编辑错误的ID。

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

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

屏幕:

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

豆(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" ));
        }
    }

1 个答案:

答案 0 :(得分:0)

当我使用@requestScoped bean时发生了这种情况。我切换到@ViewScoped,它工作正常。