2015-05-15 79 views
2

我正在使用primefaces dataTable和rowEdit事件來更改值並將其保存在我的dataTable中。當我編輯一個未經過濾的行值時,它運行良好,但當我過濾這些值並嘗試編輯時,會編輯錯誤的編號。rowEdit在dataTable Primefaces上過濾的行

例如: 我有5個記錄列表,ID範圍從1至5

我過濾列表以顯示其中ID = 5,所以它僅示出了一行記錄。 當我嘗試編輯此記錄時,我的bean正確地獲取值,但是在應用過濾器之前,對象的id不是5,它的第一個數據表的第一行。 如果我編輯過濾表的第二行,它會得到沒有過濾器的原始數據表的第二行的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")); 
     } 
    } 
+0

您正在使用什麼Primefaces的版本? – Deoxyseia

+1

並創建一個mcve – Kukeltje

+0

嗨Deoxyseia,Primefaces 5.0 –

回答

0

這發生在我身上時,我使用@RequestScoped豆。我切換到@ViewScoped,它工作正常。

+1

準確!我改變了我的bean範圍,這是正常工作!謝謝! –

相關問題