2015-05-15 3 views
2

Я использую переменные dataTable и rowEdit для изменения и сохранения значений в моей таблице данных. Когда я редактирую значение строки, которое не фильтруется, оно работает хорошо, но когда я фильтрую значения и пытаюсь редактировать, неправильный идентификатор редактируется.rowEdit отфильтрованные строки в dataTable Primefaces

Например: У меня есть список с 5 записей, начиная с идентификаторами от 1 до 5.

отфильтровать список, чтобы показать запись, где идентификатор = 5, поэтому он показывает только одну строку. Когда я пытаюсь отредактировать эту запись, мой компонент правильно принимает значения, но идентификатор объекта вместо 5, его 1, который был в первой строке данных, прежде чем я применил фильтр. Если я отредактирую вторую строку отфильтрованной таблицы, она получит идентификатор второй строки исходного файла без фильтра.

экрана:

<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")); 
     } 
    } 
+0

Какая версия Primefaces вы используете? – Deoxyseia

+1

И создать mcve – Kukeltje

+0

Hi Deoxyseia, Primefaces 5.0 –

ответ

0

Это случилось со мной, когда я использовал @requestScoped боб. Я переключился на @ViewScoped, и он работал правильно.

+1

Ровно! Я меняю свой бобовый предмет, и это работает правильно! Благодаря! –

Смежные вопросы