Componente SelectOneMenu, como defino o valor padrao?

7 respostas
D

Olá, pessoal!

Em relaçao ao SelectOneMenu, como podem ver abaixo, eu coloquei <f:selectItem itemValue=“0” itemLabel=“0” /> para o valor 0 ser o padrão e assim obrigar o usuário a selecionar um ano correto na lista que irá aparecer.

Muito bem, ocorre que este valor só fica padrão após o primeiro carregamento do form, e depois o valor que fica como padrão é aquele que o usuário selecionou por último, como faço para o valor 0 ser sempre o padrão após a gravação dos dados?

O componente cbo_ano está dentro de um <h:panelGroup id=“idBase”>, o ID do form é <h:form id=“IdForm”>

E quando mando gravar eu faço assim: action="#{handlerTR.gravar}" reRender=“IdForm, cbo_ano, cbo_mes, idBase”, mesmo assim o valor que defini para ser o padrão não é mostrado. Veja que acima até fui redundante, mas mesmo assim não funciona.

<h:selectOneMenu id="cbo_ano"  immediate="true"  
               onchange="submit();"  valueChangeListener="#{handlerTR.selecionaAno}" onkeyup="trocaEnter(this, 'txt_atveconomica', '4', event);" reRender="cbo_ano">
              <f:selectItem itemValue="0" itemLabel="0" />
              <f:selectItems    value="#{handlerTR.anoRetorno()}"  />   
</h:selectOneMenu>

Grata,
Danni

7 Respostas

D

Como este é um objeto de uso corriqueiro, como é que vocês definem um valor como padrão nele? Por que que da forma que eu defini, o valor não fica como default?

Grata,
Daniela

R

Por que voce nao deixa pra popular o valor 0 caso o usuario nao selecione um valor no combobox no servidor?

D

Rafael,

Precisamos do valor padrão 0 para obrigar o usuário a selecionar um valor, pois uma coisa que já percebemos é que o evento valueChangeListener só ocore uma vez para o mesmo valor. Assim, se o usuário selecionar o ano 2010 o evento só ocorrerá da primeira vez que for selecionado, da segunda vez o evento não vai ocorrer e aí quebra a lógica que foi colocada quando o referido evento ocorrer.

Ainda, se o usuário selecionar 2010, este valor permanece na View e assim permanece, não sei o porquê… deve ter algo errado, mas oquê é exatamente a dúvida que nos aflige.

Tchau

D

Continuando…

Eis o método que é chamado após o usuário selecionar o ano.

@Begin(join=true)
public void selecionaAno(ValueChangeEvent event) {

FacesContext context = FacesContext.getCurrentInstance();
  String s_ano = (String) event.getNewValue();
  aux.setAno(Integer.parseInt(s_ano));

  if (aux.getAno() >0 && aux.getMes() >0 &&
      aux.getEmp() >0 && aux.getSeq() >0 && aux.getAno() >0){
         //faz o carregamento dos dados
     this.carregaDados();

}

Veja que é chamado o método carregaDados(). Assim, quando o usuário selecionar o ano é feita uma pesquisa no BD para verificar se já existe aquela chave, existindo, os dados são exibidos no form. É por isso que precisamos que o evendo ValueChangeEvent sempre ocorra…

Agradecemos…

W

Ola danni,

no seu bean faça o seguinte:

public List<SelectItem> anoRetorno(){    
       List<SelectItem> retorno = new ArrayList<SelectItem>();  
       retorno.add(new SelectItem("0", "Selecione")); //primeiro atributo do SelectItem  
       for (ObjetoDoTipoDaLista obj: lista) {  
           retorno .add(new SelectItem(obj.getId(), obj.getDescricao()));  // Aqui os demais atributos adicionado de acordo com o id. Coloquei esses valores dos atributos como exemplo 
       }    
       return retorno;    
}

e na jsp:

<h:selectOneMenu id="cbo_ano"  immediate="true"    
       onchange="submit();"  valueChangeListener="#{handlerTR.selecionaAno}" onkeyup="trocaEnter(this, 'txt_atveconomica', '4', event);" reRender="cbo_ano">
       <f:selectItems    value="#{handlerTR.anoRetorno()}"  />     
</h:selectOneMenu>

acredito q assim ira funcionar…

abraços

W

ops… rsrs na verdade vc esta querendo torna-lo padrão ne isso?
se for isso, faça como falei no post anterior e tente chamar o mentodo q carrega o SelectItem novamente no final do metodo selecionaAno…

public void selecionaAno(ValueChangeEvent event) { 

       String s_ano = (String) event.getNewValue(); 
       aux.setAno(Integer.parseInt(s_ano)); 

       if (aux.getAno() >0 && aux.getMes() >0 && 
             aux.getEmp() >0 && aux.getSeq() >0 && aux.getAno() >0){ 
             //faz o carregamento dos dados 
             this.carregaDados(); 
       } 
       anoRetorno();
}

Como não tenho como testa isso aqui não tenho certeza se isso ira funcionar
mas qualquer coisa posta ai pra gente ver o resultado…

[]'s

D

Consegui fazer!!

Realmente, Wesley, da forma que que falou/exemplificou dá certo. Obrigada.

Agradeço a todos que se manifestaram nesse tópico, Wesley, Rafael.

Tchau!!!

Criado 9 de outubro de 2010
Ultima resposta 14 de out. de 2010
Respostas 7
Participantes 3