Pegar o valor da coluna de um rich:dataTable

13 respostas
R

E ai galera, blz?
Bom é o seguinte: eu tenho um rich:dataTable e coloquei uma ação nele que quando o usuario da 2 cliques
em cima de uma linha ele abre um rich:modalPanel com algumas opções para o usuario.
O meu problema é:

  • Como passar para o rich:modalPanel o valor do item que o usuario clicou?

Vou postar o meu código aqui:

<rich:dataTable value="#{projAction.listProjeto}" var="projeto" id="list" 
	 			 rows="5" reRender="ds" onRowDblClick="javascript:Richfaces.showModalPanel('panel');"
	 			 onRowMouseOver="this.style.backgroundColor='#C6E2FF'"
	 			 onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
	 		<f:facet name="header">
	 			<rich:columnGroup>
					<rich:column>
						<h:outputText value="Nome" />
					</rich:column>
					<rich:column>
						<h:outputText value="Overhead" />
					</rich:column>
	 			</rich:columnGroup>
	 		</f:facet>
	 		<rich:column filterBy="#{projeto.nome}" filterEvent="onkeyup">
	 			<f:facet name="header">
		 			<h:outputText value="" />
	 			</f:facet>
	 			<h:outputText value="#{projeto.nome}" />
	 		</rich:column>
	 		<rich:column filterBy="#{projeto.overhead}" filterEvent="onkeyup">
	 			<f:facet name="header">
		 			<h:outputText value="" />
	 			</f:facet>
	 			<h:outputText value="#{projeto.overhead}" />
	 		</rich:column>
	 		<f:facet name="footer">
		        <rich:datascroller for="list" maxPages="15" id="ds"/>
	 		</f:facet>
		</rich:dataTable>
	 	</div>

	<rich:modalPanel id="panel" width="200" height="100">
        <f:facet name="header">
            <h:panelGroup>
                <h:outputText value="Editar"/>
            </h:panelGroup>
        </f:facet>
        <f:facet name="controls">
            <h:panelGroup>
                <h:outputText value="X" id="close" style="cursor:pointer" />
                <rich:componentControl for="panel" attachTo="close" operation="hide" event="onclick"/>
            </h:panelGroup>
        </f:facet>
        <div>
	        <h:commandButton styleClass="button" action="submit" value="Duplicar" />
	        <h:commandButton action="#{projAction.teste}" value="Teste" id="dss"
	        onclick="#{rich:component('panel')}.hide()" >
		    </h:commandButton>
	        <h:commandButton styleClass="button" onclick="javascript:Richfaces.showModalPanel('excluir');" value="Excluir" />
	 	</div>
	 	</rich:modalPanel>

OBS: eu consegui pegar o valor selecionado pelo usuario colando mais uma coluna na minha tabela e nela colocando um h:commandLink passando um f:param.
Eu queria saber se tem como fazer sem usar mais uma coluna?

Obrigado.

13 Respostas

jaumzera

Deixa eu ver se eu entendi…
Você quer que a linha toda seja “clicável”?

J

Usa assim:

<h:commandLink value="clique aqui" action="#{backBean.acao}">
<f:setPropertyActionListener target="#{backBean.atributoProjeto}" value="#{projeto}"/>
</h:commandLink>

No lugar do commandLink coloca o procedimento de click que vc colocou na tabela.

target é seu alvo no backBean, e o value é a o que vc quer passar para ele, como sua variavel na tabela se chama projeto vc manda ela para o backBean e nele vc consegue acessar os dados da mesma.

Coloque um atributo na sua classe do tipo Projeto.

Abraço

R

Então jaumzera na verdade a linha inteira ja é “clicável”.
O que acontece hj é q eu clico na linha e ela abre um rich:modalPanel certinho, só que eu queria saber como passar para o modalPanel o valor da linha selecionada?
Não precisa ser o valor da linha inteira, só quero o nome #{projeto.nome}

Valeu.

R

Então jgavazzisp será q vc poderia me dar um exemplo do codigo do backBean?

hudson.negao

tenta passar um parametro
utilizando f:param

jaumzera

Cara, tive um problema parecido.
Ao selecionar a linha, faça com que a função no backing bean deixe disponível o usuário (como propriedade).
Daí, pelo rich:modalPanel você busca os dados do usuário direto no backing bean (#{userBean.usuario.nome}, etc.)

R

Então cara mas a minha duvida é como fazer para chamar o backing bean e passar para ele o usuario selecionado?

jaumzera

Dá pra fazer de algumas formas…

Eu resolvi assim:

  1. crie uma propriedade usuário no seu backing bean (objeto + get e set)
  2. na view, você passa um parâmetro f:param ou a4j:actionparam para o BB
&lt;f:param name="userId" value="#{item.id}"/&gt;
  1. no evento oncomplete, do objeto que chama a ação, você mostra o modal
oncomplete="Richfaces.showModalPanel('deleteModal')"
  1. no modal, você busca os dados direto do BB

Porém, assume-se que seu BB esteja no escopo da sessão e você vai ter que usar o FacesContext para acessar o parâmetro enviado, o que não me agrada muito.

R

Galera consegui resolver o problema.
Vou postar abaixo como ficou o código da minha tabela.

<rich:dataTable value="#{projAction.listProjeto}" var="projeto" id="list" 
	 			 rows="5" reRender="ds" rendered="#{not empty projAction.listProjeto}"
	 			 onRowMouseOver="this.style.backgroundColor='#C6E2FF'"
	 			 onRowMouseOut="this.style.backgroundColor='#{a4jSkin.tableBackgroundColor}'">
	 		<f:facet name="header">
	 			<rich:columnGroup>
					<rich:column>
						<h:outputText value="Nome" />
					</rich:column>
					<rich:column>
						<h:outputText value="Overhead" />
					</rich:column>
					<rich:column>
	 					<h:outputText value="Opções" />
	 				</rich:column>
	 			</rich:columnGroup>
	 		</f:facet>
	 		<rich:column filterBy="#{projeto.nome}" filterEvent="onkeyup">
	 			<f:facet name="header">
		 			<h:outputText value="" />
	 			</f:facet>
	 			<h:outputText value="#{projeto.nome}" />
	 		</rich:column>
	 		<rich:column filterBy="#{projeto.overhead}" filterEvent="onkeyup">
	 			<f:facet name="header">
		 			<h:outputText value="" />
	 			</f:facet>
	 			<h:outputText value="#{projeto.overhead}" />
	 		</rich:column>
	 		<rich:column>
	 			<f:facet name="header">
	 				<h:outputText value="" />
	 			</f:facet>
	 			<a4j:commandLink type="button" action="#{projAction.getValueDataTable}" styleClass="link" 
	 					oncomplete="javascript:Richfaces.showModalPanel('panel');" value="Opções" >
	 				<f:param name="rowValue" value="#{projeto.nome}"/>
	 			</a4j:commandLink>
	 		</rich:column>
	 		<f:facet name="footer">
		        <rich:datascroller for="list" maxPages="15" id="ds"/>
	 		</f:facet>
		</rich:dataTable>

Obrigado a todos.

Marcio_N_Carvalho

RFaria,

Poderia postar a parte do Backing Bean?

R

E ai Marcio…blz?

Cara eu num tenho mais esse código…vo fica te devendo essa.

Até mais.

Marcio_N_Carvalho

Opa, blz!

De qualquer forma agradeço, consegui resolver e amanhã posto aqui só para finalizar…

valeu!!!

Marcio_N_Carvalho

Pessoal,

Desculpe por não ter colocado a solução aqui, segue:

<rich:dataTable id="tableVeiculo" sortMode="single" var="veiculo" value="#{VeiculoMB.veiculoList}"> // No evento "onRowDblClick" é disparado o método "fetchCurrentRow" do ManagedBean <a4j:support reRender="panelFrmVeiculo" event="onRowDblClick" actionListener="#{VeiculoMB.fetchCurrentRow}"> // Aqui, guardo o atributo "Id" na variavel "vin" que será invocada na "actionListener" acima <a4j:actionparam name="vin" value="#{veiculo.idVeiculo}" /> </a4j:support> // Columns </rich:dataTable>

Meu ManagedBean

public void fetchCurrentRow(ActionEvent event) {
        veiculoSelecionado = new Veiculo();
        // Através dessa linha, o Java Varre as Pgs JSF a procura do parametro "vin" (Aquele que declarei na linha 05. do exemplo acima)
        idVeiculo = Long.parseLong(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("vin"));
       
        // Percorrendo minha lista em busca do Objeto com o id recuperado da página
        for (Veiculo veiculoDaLista : veiculoList){
            if (veiculoDaLista.idVeiculo == idVeiculo) {
                veiculoSelecionado = vaiculoDaLista;
                break;
            }
        }
        break;
    }

Espero ter ajudado. Abs!!!

Criado 14 de janeiro de 2009
Ultima resposta 23 de fev. de 2012
Respostas 13
Participantes 5