JSF pegar posicao de um <h:SelectOneMenu> na tabela[RESOLVIDO]

10 respostas
R
preciso no evento change do , pegar a posiçao que este combo esta na tabela.
<p:panel id="panel2">
	     <h:form>
	     <p:dataTable id="dadosColunas" value="#{tabelasBanco.colunaTabela}"  var="col"  >
     	    <f:facet name="header"> 
     	        Definir Campos
     	    </f:facet> 
     	    <p:column headerText="Colunas da Tabela">
     	    	<h:outputText value="#{col.nomeCampo}"></h:outputText>
     	    </p:column>
     	     
     	    <p:column headerText="Colunas do Arquivo">            
		   	   <h:selectOneMenu  id="selectDados"   value="#{arquivocvs.selecionado}" valueChangeListener="#{arquivocvs.teste}">
							<p:ajax event="change"/> 
							<f:selectItem itemLabel="Selecione uma Coluna"/>
							<f:selectItems id="dadosCabecalho" value="#{arquivocvs.cabecalho}"  />
		   	  </h:selectOneMenu>               
     	    </p:column>   	    	     
 	     </p:dataTable>
 	     </h:form> 
	 </p:panel>

o que eu preciso é saber como pegar o valor selecionado no combo e a posicao dele (row) na tabela.
Alguem pode dar alguma luz, ou talvez, uma outra forma de implementar ?
Att.

10 Respostas

A

Ola Ricardo. Especifique melhor que framework vc está usando pra p:dataTable. Pelo visto é primefaces, onde nao tenho muita experiencia, mas vai aqui uma dica: No richfaces tem um atributo na tag dataTable chamado rowKeyVar. Ficaria mais ou menos assim:

<rich:dataTable rowKeyVar="linha">
 <p:column headerText="Colunas do Arquivo">              
               <h:selectOneMenu  id="selectDados"   value="#{arquivocvs.selecionado}" valueChangeListener="#{arquivocvs.teste}" onchange="alert('#{linha}')">  
                              <f:selectItem itemLabel="Selecione uma Coluna"/>  
                            <f:selectItems id="dadosCabecalho" value="#{arquivocvs.cabecalho}"  />  
              </h:selectOneMenu>               
</rich:dataTable>

Ou seja, aquele ALERT la em onchange do selectOneMenu vai imprimir o numero da linha da tabela, começando por 0.
No caso do PrimeFaces, vi que o nome é bastante parecido. No seu caso, deve ser “rowIndexVar”.
Quanto ao valor do combo, vc pode passar via javascript, ja que vc ainda nao submeteu este valor.
Espero ter ajudado.

R

Bom dia adrian!

sim uso primeFaces, realmente existe rowIndexVar, só nao consigo saber como pegar o valor do combo + o valor do index dele. no metodo teste.

<p:dataTable  rowIndexVar="row"  id="dadosColunas" value="#{tabelasBanco.colunaTabela}"  var="col"  >
     	    <f:facet name="header"> 
     	        Definir Campos
     	    </f:facet> 
     	    <p:column headerText="Colunas da Tabela">
     	    	<h:outputText value="#{col.nomeCampo}"></h:outputText>
     	    </p:column>
     	     
     	    <p:column headerText="Colunas do Arquivo">            
		   	  		
                                  <h:selectOneMenu  id="selectDados" tabindex="#{row}"  value="#{arquivocvs.selecionado}" valueChangeListener="#{arquivocvs.teste}"> 
     						<p:ajax event="change"/> 
					                <f:selectItem itemLabel="Selecione uma Coluna"/>
						<f:selectItems id="dadosCabecalho" value="#{arquivocvs.cabecalho}" />	   	 		
		   </h:selectOneMenu>
		   	 	           
     	    </p:column>
o valueChangeListener="#{arquivocvs.teste} pego dessa forma.
public void teste(ValueChangeEvent vce){
	         //  o vce tem um metodo getParente pra pegar o pai,  mas nao consigo o valor da row.	
	}
A

Cara, vou dar um chute gambiarrento com o que me recordo de cabeça, e eventuais correções de metodos ou nomes ficam pela sua tentativa ai :lol:

Dentro do seu h:selectItems ai, inclua isso aqui:

<f:attribute name="xpto" value"rowIndexVarDoPrimeFacesQueRetornaOIndiceDaLinha" />

No seu método invocado no “actionChangeListener”, tente isso:

UIComponent c = suaVariavelValueChangeEvent.getComponent();

Integer row = (Integer) c.getAttributes("xpto"); //aqui vai o nome do atributo que voce definou na tag f:attribute

Até deve funcionar…

R
<p:dataTable  rowIndexVar="riv"

Entao, se eu deixar

<f:attribute name="posicaoTabela" value="#{riv}" /> vem null;
se eu colocar

<f:attribute name="posicaoTabela" value="10" /> eu consigo pegar o valor 10.

eu fiz o teste que o adrian falou, colocando no onChange=“javascript:alert(’#{riv}’)” no Select o valor é mostrado correto.

A

Supondo que seu rowIndexVar=“row”

<h:selectOneMenu  id="selectDados" tabindex="#{row}"  value="#{arquivocvs.selecionado}" valueChangeListener="#{arquivocvs.teste}" onchange="submit()">   
    <f:attribute name="linhaTable" value"#{row}" />
//Omitido os selectItems

</h:selectOneMenu>

Seu bean:

public void teste(ValueChangeEvent event){
//Linha da tabela
String linha = (String) event.getComponent().getAttributes().get("linha");
//Valor do select
HtmlSelectOneMenu sel = (HtmlSelectOneMenu) event.getComponent();
String valor = (String) sel.getValue();
}

Espero ter ajudado. Atente para o onchange=“submit()” …

A

Desculpa… Consertando… retire esse tabindex ai… ficaria assim

<p:dataTable  rowIndexVar="riv" ...
<h:selectOneMenu valueChangeListener="#{seuBean.eventListener}" onchange="submit();" > 
       <f:attribute  name="linhaTabela" value="#{riv}"/>
//Omitindo items        
</h:selectOneMenu>

O bean vc pega la a linha e o valor como te passei anteriormente

A

Pô, a minha gambiarra deveria ter funcionado, hein :lol: … ou nao, o valor do atributo deve estar sendo processado quando voce faz o “getAttribute” e o valor “#{riv}” já não existe mais…

Por curiosidade, voce está usando qual versão do JSF?

Se for a versão 2, sugiro não usar o valueChangeListener e sim o p:ajax do Prime, que já tem ai no seu código, chamando um metodo do seu bean e passando o valor como parametro (JSF 2 permite isso,nao?). Assim:

//metodo do bean
public void metodoInvocadoNoActionDaTagPAjax(int linha){
//...
//na sua pagina seria: <p:ajax event="change" action"#{bean.metodoInvocadoNoActionDaTagPAjax(rowIndexVar)}"
}

Se a sua versão do JSF for 1.2, não vai rolar a passagem do parametro no action, então sugiro o uso do f:param dentro da p:ajax

<p:ajax event="change" action"#{bean.metodoInvocadoNoActionDaTagPAjax(rowIndexVar)}>
  <f:param name="nomeDoParametro" value="#{rowIndexVar}" />
</p:ajax>

E no bean…

ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
String rowIndexVar = ctx.getRequestParametersMap().get("nomeDoParametro") //ACHO que é getRequestParametersMap...
A

Pô, a minha gambiarra deveria ter funcionado, hein :lol: … ou nao, o valor do atributo deve estar sendo processado quando voce faz o “getAttribute” e o valor “#{riv}” já não existe mais…

Por curiosidade, voce está usando qual versão do JSF?

Se for a versão 2, sugiro não usar o valueChangeListener e sim o p:ajax do Prime, que já tem ai no seu código, chamando um metodo do seu bean e passando o valor como parametro (JSF 2 permite isso,nao?). Assim:

//metodo do bean
public void metodoInvocadoNoActionDaTagPAjax(int linha){
//...
//na sua pagina seria: <p:ajax event="change" action"#{bean.metodoInvocadoNoActionDaTagPAjax(rowIndexVar)}"
}

Se a sua versão do JSF for 1.2, não vai rolar a passagem do parametro no action, então sugiro o uso do f:param dentro da p:ajax

<p:ajax event="change" action"#{bean.metodoInvocadoNoActionDaTagPAjax(rowIndexVar)}>
  <f:param name="nomeDoParametro" value="#{rowIndexVar}" />
</p:ajax>

E no bean…

ExternalContext ctx = FacesContext.getCurrentInstance().getExternalContext();
String rowIndexVar = ctx.getRequestParametersMap().get("nomeDoParametro") //ACHO que é getRequestParametersMap...
R

Agradeço Adrian e alias.

alias, é jsf2.0 , porem funcionou da segunda forma que voce passou, usando <f:param

Obrigado.
att.

A

Que bom, cara…nesse caso pediria a gentileza de editar o seu primeiro post e alterar o título do tópico com [RESOLVIDO], para que os colegas com o mesmo problema tambem tenham uma solução à mao :wink:

Criado 21 de setembro de 2011
Ultima resposta 22 de set. de 2011
Respostas 10
Participantes 3