Jsf 行编辑dataTable Primefaces上的筛选行
我正在使用primefaces dataTable和rowEdit事件来更改和保存数据表中的值。当我编辑未过滤的行值时,它工作正常,但当我过滤值并尝试编辑时,编辑的id错误 例如: 我有一个包含5条记录的列表,ID从1到5不等 我过滤列表以显示id=5的记录,因此它只显示一行。 当我尝试编辑此记录时,我的bean正确地获取了值,但是对象的id不是5,而是1,在我应用过滤器之前,它位于datatable的第一行。 如果我编辑过滤表的第二行,它将获得原始datatable的第二行的id,而不使用过滤器 屏幕:Jsf 行编辑dataTable Primefaces上的筛选行,jsf,jsf-2,primefaces,datatable,Jsf,Jsf 2,Primefaces,Datatable,我正在使用primefaces dataTable和rowEdit事件来更改和保存数据表中的值。当我编辑未过滤的行值时,它工作正常,但当我过滤值并尝试编辑时,编辑的id错误 例如: 我有一个包含5条记录的列表,ID从1到5不等 我过滤列表以显示id=5的记录,因此它只显示一行。 当我尝试编辑此记录时,我的bean正确地获取了值,但是对象的id不是5,而是1,在我应用过滤器之前,它位于datatable的第一行。 如果我编辑过滤表的第二行,它将获得原始datatable的第二行的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>
当我使用@requestScoped bean时,这种情况就发生了。我切换到@ViewScoped,它工作正常。您使用的Primefaces版本是什么?嗨,Deoxysia,Primefaces 5.0正是!我改变了我的bean范围,这样就可以正常工作了!谢谢
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" ));
}
}