Dúvida JSF - Pegar valores alterados na lista inteira

11 respostas
I

Boas pessoal!!!

Minha dúvida é a seguinte:

Eu tenho uma DataTable dinâmica na minha aplicação que é criada usando uma lista e tags JSTL como c:if e c:forEach. Porém a tabela tem campos que poderão ser editados na própria tabela com textBox, sendo que a tabela será toda atualizada de uma vez só e aí é que vem a dúvida…

Como pegar os valores modificados desta lista? Quando eu seto os campos para receber o valor do indice da lista ele automaticamente atualiza a lista? :shock: :shock: :?: :?: :?

este é o meu armengue…ops…código!!! rsrsrs

<rich:dataTable id="tabela" value="1" width="100%" rows="5" onRowMouseOver="this.style.backgroundColor='#BED6F8'"
onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
            			
	<f:facet name="header">
	<rich:columnGroup>
								
		<c:forEach var="cab" items="#{torreMB.cabecalhos}">
			<rich:column>								
				<h:outputText value="#{cab}" />										
			</rich:column>
		</c:forEach>
			<rich:column>
				<h:outputText value="Excluir" />
			</rich:column>
	</rich:columnGroup>
	</f:facet>
						
	<c:forEach var="col" items="#{torreMB.listaUnidades}" varStatus="c">
						
		<rich:columnGroup>
			<rich:column>
				<h:inputText value="#{col.nrunidade}" size="4" styleClass="input" disabled="#{torreMB.disableCampos}" />
			</rich:column>
			<rich:column>
				<h:inputText value="#{col.nrandar}" size="2" styleClass="input" disabled="#{torreMB.disableCampos}" />
			</rich:column>
			<rich:column>
				<h:selectOneMenu value="#{col.idtipounidade}" styleClass="select" disabled="#{torreMB.disableCampos}">
					<f:selectItems value="#{torreMB.itensTipoUnidade}"/>
				</h:selectOneMenu>
			</rich:column>
		        <c:choose>
									
			<c:when test="#{empty torreMB.listaUnidades[c.index].areas}">
                              <c:if test="#{torreMB.countCab > 3}">										
			      <c:forEach begin="0" end="#{torreMB.countCab - 4}">
					<rich:column styleClass="colunaCenter">
						<h:inputText value="" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}" onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)">
							<f:convertNumber pattern="###,##0.000000"/>
							<a4j:support event="onchange" action="#{torreMB.updateActionUnidade}"></a4j:support>
						</h:inputText>
					</rich:column>
				</c:forEach>
				</c:if>
			</c:when>
			<c:otherwise>
										
				<c:forEach var="area" items="#{torreMB.listaUnidades[c.index].areas}">
					<rich:column styleClass="colunaCenter">
						<h:inputText value="#{area.vlrArea}" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}" onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)" >
							<f:convertNumber pattern="###,##0.000000"/>
							<a4j:support event="onchange" action="#{torreMB.updateActionUnidade}"></a4j:support>
						</h:inputText>
					</rich:column>
				</c:forEach>
										
			</c:otherwise>
			</c:choose>
								
			<rich:column styleClass="colunaCenter">
			<a4j:region>
				<a4j:commandLink  title="#{msgsMAD.htExcluir}" action="# torreMB.deleteActionUnidade}" disabled="#{torreMB.disableCampos}"onclick="if (!confirm('#{msgsMAD.opConfirmaExcluir}')) return false" reRender="lista,painelGeral">
					<h:graphicImage value="../img/deletar.gif" width="15px" height="15px" styleClass="botao" style="margin-left: 5px"/>
					<f:setPropertyActionListener value="#{col}" target="#{torreMB.unidadeT}" />
				</a4j:commandLink>
			</a4j:region>
			</rich:column>
		</rich:columnGroup>
	</c:forEach>
</rich:dataTable>

Grato!!!

<><

11 Respostas

daviddjp

Deixa eu ver se eu entendi… vc quer saber se quando vc colocar o valor no inputText dentro do dataTable ele vai alterar esse valor na sua lista?
Se essa for a dúvida ele vai alterar o valor sim.
Mas vai alterar quando vc ser submit na página.
A não ser que vc use ajax para cada vez que mudar o valor no inputText ele alterar o valor na tua lista.

Não sei se entendi sua duvida…

Abraço…

I

então…a minha dúvia era essa mesmo…porém o problema é que a minha dataTable não tem nenhuma relação direta com a lista, como mostrado no código acima, eu só uso ela para montar na tela com as JSTL…dessa forma eu não estou conseguindo pegar o valor quando chamo o método…

obrigado pela resposta…e se souber como fazer me ajude mais!! hehehe

:wink:

M

Olá icthusjr!

Pelo que puder ver seu dataTable tem relação com a lista na linha 18:

<c:forEach var="col" items="#{torreMB.listaUnidades}" varStatus="c">

Para ele poder atualizar o valor você precisa dar um submit!

Agora não entendi muito sua dúvida, se for essa já está resolvido!

Abraços,
Qualquer coisa estameos aí!

daviddjp

Realmente nessa linha tem a realação com a lista.

<c:forEach var="col" items="#{torreMB.listaUnidades}" varStatus="c">

No caso desses inputText que estão logo abaixo

<rich:column> <h:inputText value="#{col.nrunidade}" size="4" styleClass="input" disabled="#{torreMB.disableCampos}" /> </rich:column> <rich:column> <h:inputText value="#{col.nrandar}" size="2" styleClass="input" disabled="#{torreMB.disableCampos}" /> </rich:column>

o valor que vc colocar ai vai alterar sua lista. Tem que alterar pq vc tá mudando na referência.
São esses os campos que vc quer que mude na lista?

E um detalhe, na linha 38 tem um campo de texto com value vazio.

<h:inputText value="" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}" onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)">
I

Vejam…acho que nõ me expressei direito…ningume entendeu…kkkk

bom é o seguinte…

eu monto esta dataTable na tela com o código acima…nos campos da dataTable eu tenho inputTexts que mostram os valores para serem alterados ou não…eu quero que ao clicar em um a4j:commandLink que está fora da tabela, pois é um botão na barra de ferramentas, eu consiga pegar todos os valores da dataTable, alterados ou não para poder fazer o update nas tabelas do banco…fui claro agora? :smiley: :?:

galera muito obrigado pelas ajudas…

I

[quote=daviddjp]Realmente nessa linha tem a realação com a lista.

<c:forEach var="col" items="#{torreMB.listaUnidades}" varStatus="c">

No caso desses inputText que estão logo abaixo

<rich:column> <h:inputText value="#{col.nrunidade}" size="4" styleClass="input" disabled="#{torreMB.disableCampos}" /> </rich:column> <rich:column> <h:inputText value="#{col.nrandar}" size="2" styleClass="input" disabled="#{torreMB.disableCampos}" /> </rich:column>

o valor que vc colocar ai vai alterar sua lista. Tem que alterar pq vc tá mudando na referência.
São esses os campos que vc quer que mude na lista?

E um detalhe, na linha 38 tem um campo de texto com value vazio.

<h:inputText value="" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}" onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)">

opa nem tinha visto sua resposta…

bem eh isso mesmo…eh que quando eu tenho uma lista de areas para cada unidade ], ou seja em cada item da minha lista de Unidades eu tenho uma lista de áreas, então quando ele não encontra as áreas para este item ele coloca vazio…só para dizer que pode ser inserido também…

vlwz!!

daviddjp

icthusjr:
Vejam…acho que nõ me expressei direito…ningume entendeu…kkkk

bom é o seguinte…

eu monto esta dataTable na tela com o código acima…nos campos da dataTable eu tenho inputTexts que mostram os valores para serem alterados ou não…eu quero que ao clicar em um a4j:commandLink que está fora da tabela, pois é um botão na barra de ferramentas, eu consiga pegar todos os valores da dataTable, alterados ou não para poder fazer o update nas tabelas do banco…fui claro agora? :smiley: :?:

galera muito obrigado pelas ajudas…

Então cara… realmente não tinha entendido o que vc queria. mas a situacao continua a mesma.
Se vc preenche os campos de texto com uma lista e essa lista é de um tipo…
por exemplo List<ClasseA> lista = new ArrayList<ClasseA>;
ao alterar o valor no campo de texto ele vai mudar essa referência na lista, ou seja, quando vc clica no link que vc colocou, esteja ele dentro ou fora da tabela
é so vc pegar a lista e mandar salvar.
Sua lista vai estar alterada.

Se o seu ManagedBean tiver escopo request pode estar acontecendo de ele perder os valores no submit.

Caso seja essa situação olha esse link.

http://www.urubatan.com.br/jsf_commandlink_datatable_problemas/

Ai ele fala de commandLink dentro de dataTable, mas pode ser que esteja ocorrendo o mesmo problema.

Abraço!

I

daviddjp muito obrigado, pela ajuda…ainda não tah funcionando com o cammandLink fora da tabela, mas já me deu uma Luz!!! kkk

eu consegui pegar o valor colocando no onchange do inputText o método para fazer o update, mas vou continuar tentando, porque senão vai ter uma requisição ao banco a cada mudança nos inputs e ai já viu a carroça…hehehehe

mas valeu mesmo, e obrigado a todos pela ajuda!!!

God Bless You All!!
<><

M

Por favor, coloca o código da sua página inteira, para a gente ver aonde está o botão e aonde está o form, e também o método que você chama no bean ao clicar no botão!

abraços

I

Ai markinhos....
este é o código...

Esta página entra num include da página principal, por isso não tem o f:view e o a4j:form

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
	xmlns:ui="http://java.sun.com/jsf/facelets"
	xmlns:f="http://java.sun.com/jsf/core"
	xmlns:h="http://java.sun.com/jsf/html"
	xmlns:a4j="http://richfaces.org/a4j"
	xmlns:rich="http://richfaces.org/rich"
	xmlns:c="http://java.sun.com/jstl/core">


<rich:panel id="panelUnidades" style="border: 0px; width : 99%; margin:0 auto;">
	<rich:messages var="messages" id="msgUnidade" styleClass="#{torreMB.style}"  />					
	<table width="100%" border="0" cellspacing="1" cellpadding="0">
		<tr>
			<td width="6%">
			<div align="center">
			<a4j:region>
				<a4j:commandLink id="voltar" title="#{msgsMAD.htVoltar}" action="#{torreMB.voltar}" 
				reRender="panelUnidades, painelGeral">
					<h:graphicImage value="../img/btnVoltar.png" styleClass="botao" />
				</a4j:commandLink>
			</a4j:region>
			</div>
			</td>
			<td width="6%">
			<div align="center">
			<a4j:region>
				<a4j:commandLink id="novaUnidade" title="#{msgsMAD.htNovo}" onclick="#{rich:component('NovoUnidade')}.show()" 
					action="#{torreMB.clearActionUnidade}" reRender="panelUnidades, painelNovoUnidade, painelGeral" >
					<h:graphicImage value="../img/btnNovo.png" styleClass="botao" />
				</a4j:commandLink>
			</a4j:region>			
			</div>
			</td>
			<td width="6%">
			<div align="center">
			<a4j:region>
				<a4j:commandLink id="editarUnidade" title="#{msgsMAD.htEditar}" action="#{torreMB.habilitarCampos}" 
				rendered="#{torreMB.rendBtnEditar}" reRender="panelUnidades, painelGeral">
					<h:graphicImage value="../img/btnEditar.png" styleClass="botao" />
				</a4j:commandLink>
			</a4j:region>
			<a4j:region>	
				<a4j:commandLink id="salvarUnidade" title="#{msgsMAD.htSalvar}" action="#{torreMB.updateActionUnidade}"
				rendered="#{torreMB.rendBtnSalvar}" reRender="panelUnidades, painelGeral">
					<h:graphicImage value="../img/btnSalvar.png" styleClass="botao" />			
				</a4j:commandLink>
			</a4j:region>		
			</div>
			</td>
			<td width="6%">
			<div align="center"></div>
			</td>
			<td width="82%"></td>
		</tr>
	</table>
	<rich:spacer height="10px"></rich:spacer>
	
	<h:inputHidden id="idTorre" value="#{torreMB.torreT.idtorre}" />
	<h:panelGrid columns="2">	
		<h:outputText value="#{msgsMIM.opBloco}" style="font-weight: bold; font-size: 14px"/>
		<h:outputText id="nomeTorre" value="#{torreMB.torreT.nmtorre}" style="font-size: 14px"/>
	</h:panelGrid>
	
	<rich:spacer height="10px"></rich:spacer>
	<h:panelGrid columns="1">
		<c:if test="#{torreMB.rendDataTable}">
			<table width="100%" border="0" cellspacing="0" cellpadding="0" align="left" >
			<tr>
				<td>
					<rich:dataTable id="tabela" value="1" width="100%" onRowMouseOver="this.style.backgroundColor='#BED6F8'"
            		onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
            			
						<f:facet name="header">
							<rich:columnGroup>
								
								<c:forEach var="cab" items="#{torreMB.cabecalhos}">
									<rich:column>								
										<h:outputText value="#{cab}" />										
									</rich:column>
								</c:forEach>
								<rich:column>
									<h:outputText value="Editar" />
								</rich:column>
								<rich:column>
									<h:outputText value="Excluir" />
								</rich:column>
							</rich:columnGroup>
						</f:facet>
						
						<c:forEach var="col" items="#{torreMB.listaUnidades}" varStatus="c">
						
							<rich:columnGroup>
								<rich:column>
									<h:inputText value="#{col.nrunidade}" size="4" styleClass="input" disabled="#{torreMB.disableCampos}" />
								</rich:column>
								<rich:column>
									<h:inputText value="#{col.nrandar}" size="2" styleClass="input" disabled="#{torreMB.disableCampos}" />
								</rich:column>
								<rich:column>
									<h:selectOneMenu value="#{col.idtipounidade}" styleClass="select" disabled="#{torreMB.disableCampos}">
										<f:selectItems value="#{torreMB.itensTipoUnidade}"/>
									</h:selectOneMenu>
								</rich:column>
								<c:choose>
									
									<c:when test="#{empty torreMB.listaUnidades[c.index].areas}">
									<c:if test="#{torreMB.countCab > 3}">										
										<c:forEach begin="0" end="#{torreMB.countCab - 4}">
											<rich:column styleClass="colunaCenter">
												<h:inputText value="#{area.vlrArea}" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}"
													onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)">
													<f:convertNumber pattern="###,##0.000000"/>
													
												</h:inputText>
											</rich:column>
										</c:forEach>
									</c:if>
									</c:when>
									<c:otherwise>
										
										<c:forEach var="area" items="#{torreMB.listaUnidades[c.index].areas}">
											<rich:column styleClass="colunaCenter">
												<h:inputText value="#{area.vlrArea}" size="8" maxlength="10" styleClass="input" disabled="#{torreMB.disableCampos}"
												onkeydown="FormataMoedaSeis(this,10,event)" onkeypress="return maskKeyPress(event)" >
													<f:convertNumber pattern="###,##0.000000"/>
												</h:inputText>
											</rich:column>
										</c:forEach>
										
									</c:otherwise>
								</c:choose>
								
								<rich:column styleClass="colunaCenter">
									<a4j:region>
									<a4j:commandLink  title="#{msgsMAD.htEditar}" action="#{torreMB.updateActionUnidade}" 
									disabled="#{torreMB.disableCampos}" reRender="painelGeral">
										<h:graphicImage value="../img/edit.gif" width="15px" height="15px" styleClass="botao" 
										style="margin-left: 5px"/>
											<f:setPropertyActionListener value="#{col}" target="#{torreMB.unidadeT}" />
									</a4j:commandLink>
									</a4j:region>
								</rich:column>
								
								<rich:column styleClass="colunaCenter">
									<a4j:region>
									<a4j:commandLink  title="#{msgsMAD.htExcluir}" action="#{torreMB.deleteActionUnidade}" disabled="#{torreMB.disableCampos}"
									onclick="if (!confirm('#{msgsMAD.opConfirmaExcluir}')) return false" reRender="lista,painelGeral">
										<h:graphicImage value="../img/deletar.gif" width="15px"
											height="15px" styleClass="botao" style="margin-left: 5px"/>
											<f:setPropertyActionListener value="#{col}" target="#{torreMB.unidadeT}" />
									</a4j:commandLink>
									</a4j:region>
								</rich:column>
							</rich:columnGroup>
						</c:forEach>
					</rich:dataTable>
				</td>
			</tr>
			</table>
		</c:if>
		</h:panelGrid>
</rich:panel>
</html>
I

Galera desculpe a demora, mas ja consegui resolver o meu problema…

Realmente eu estava fazendo referência a minha lista na dataTable, mas o que eu errei foi em colocar vários a4j:region limitando a área de ajax a aquela região somente, por isso quando eu tentava executar um botão fora dessa área ele não fazia nada!!!

mas valeu pela ajuda de todos, sema troca de conhecimento nõ teria aberto minha visão!!

PArabéns ao guj pelo fórum!!

Criado 26 de junho de 2009
Ultima resposta 7 de jul. de 2009
Respostas 11
Participantes 3