gpt4 book ai didi

jsf - rowEdit 在 dataTable Primefaces 上过滤行

转载 作者:行者123 更新时间:2023-12-02 04:49:23 29 4
gpt4 key购买 nike

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

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

我过滤列表以显示 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>

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 并且它工作正常。

关于jsf - rowEdit 在 dataTable Primefaces 上过滤行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30267451/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com