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

preciso no evento change do <h:SelectOneMenu>, pegar a posiçao que este combo esta na tabela.

[code]
<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>[/code]

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.

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.

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.

[code] <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>[/code] 

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.	
	}

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…

 <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.

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()” …

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

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...

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...

Agradeço Adrian e alias.

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

Obrigado.
att.

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: