SelectOneMenu e DataTable

4 respostas
B

olá pessoal, seguinte estou desenvolvendo uma aplicação onde necessito criar um dataTable em que cada uma de suas linhas existe um SelectOneMenu. A dúvida é como recuperar os dados selecionados em todos os selectOneMenus no Managed Bean.

<rich:dataTable var="item" width="100%"
     rows="10" id="Habilidades" value="#{habilidadeCandidato.habilidades}">
     <c:facet name="header"><h:outputText value="Habilidades Específicas"/></c:facet>		 	
     <rich:column>					
          <c:facet name="header"><h:outputText value="Habilidade"/></c:facet>
          <h:outputTextvalue="#item.descricao}"/>								
     </rich:column>	
     <rich:column>					
          <c:facet name="header">
               <h:outputText value="Nível"/>
          </c:facet>										
          <h:selectOneMenu value="#{habilidadeCandidato.nivel}">
               <c:selectItems value="#{habilidadeCandidato.listaNivel}"/>
	       <c:converter converterId="EnumConverter"/>
          </h:selectOneMenu>
    </rich:column>												
</rich:dataTable>

4 Respostas

Z111

Todos os selects deverão ter valor?

Uma idéia (e somente isto) seria manusear um Collection (List ou Set, talvez) no setter do bean (adicionar a collection ou alterar o valor).

Imagino isto partindo do pressuposto q vc não sabe quantos selects existirão.

Só uma idéia…

B

Sim todos terao valor sim, os mesmos são preenchidos através de um Enum.

Cheguei a pensar em algo como

...
List<NivelHabilidade> nivel = new ArrayList<NivelHabilidade>();
...

public void setNivel(NivelHabilidade nivel){
      this.nivel.add(nivel);

}

Mas surgiu a dúvida de como recuperar estes valores novamente e preencher os selects com os valores armazenados no banco, quando esta tela for aberta novamente.

Z111

era exatamente o q eu havia imaginado…

mas como é o comportamento durante o submit?

É sequencial, ou seja, vai funcionar de forma ordenada (select1 é submetido e atribuido, depois select2 e assim por diante?).

Todos serão submetidos?

Não tenho como testar agora, soh a noite. Se vc testar, por favor poste o resultado…

B

Bom consegui fazer o que estava tentando, e a solucao é mais simples do que eu imaginava. Segue a solução caso alguem no futuro tenha a mesma dúvida.

O que fiz foi o seguinte, eu modifiquei o value do SelectOneMenu para o value do item que esta sendo iterado na tabela.

alterei a seguinte linha então
<h:selectOneMenu value="#{item.nivel}">

O meu código agora ficou assim

<rich:dataTable var="item" width="100%"
			rows="10" id="Habilidades" value="#{habilidadeCandidato.curriculoHabilidade}">
		 		<c:facet name="header"><h:outputText value="Habilidades Específicas"/></c:facet>		 	
				<rich:column>					
					<c:facet name="header"><h:outputText value="Habilidade"/></c:facet>
					<h:outputText value="#{item.habilidade.descricao}"></h:outputText>														
				</rich:column>	
				<rich:column>					
					<c:facet name="header"><h:outputText value="Nível"/></c:facet>										
					<h:selectOneMenu value="#{item.nivel}">
						<c:selectItems value="#{habilidadeCandidato.listaNivel}"/>
						<c:converter converterId="EnumConverter"/>
					</h:selectOneMenu>																		
				</rich:column>												
			</rich:dataTable>

No ManagedBean eu peguei o valor da senguinte forma

private List<CurriculoHabilidade> curriculoHabilidade = new ArrayList<CurriculoHabilidade>();

....
getter e setters
....

	public String salvar() {
		System.out.println("Salvar");
		for(CurriculoHabilidade objNivel : curriculoHabilidade) {
			System.out.println(objNivel.getHabilidade().getDescricao());
			System.out.print(" - " +objNivel.getNivel());
			
		}
		return null;
	}

Quando o form é enviado os valores que estao no datatable são setados para os novos valores, ou seja a própria lista que preenche o datatable recebe os novos valores após a modificação.

Bem simples né…

Valeu

Criado 7 de agosto de 2008
Ultima resposta 7 de ago. de 2008
Respostas 4
Participantes 2