(RESOLVIDO) Setar valor num selectOneMenu de acordo com dados de uma tabela

6 respostas
T

Olá pessoal,

tenho uma página de cadastro de livros, onde a lista de editoras é exibida através de um selectOneMenu. Esse selectOneMenu é preenchido com um ArrayList de SelectItem. Tenho também uma página que exibe uma tabela com os livros registrados. Nessa tabela há um link para atualizar as informações. Ao clicar nesse link, os dados da tabela são copiados e transmitidos para a página de cadastro de livros.
Bem, gostaria que, ao obter os dados do livro, o selectOneMenu de editoras fosse setado para o valor que é mostrado na tabela. Como posso fazer isso?

Página de cadastro de livros.

<tr>
     <td>
          <label>Editora:</label>
     </td>
     <td>
          <h:selectOneMenu  value="#{livrosC.livro.editora_id}" name="editora" id="editora">
               <f:selectItems value="#{editorasC.listaDeSelectItemDeEditoras}" />
          </h:selectOneMenu>
          <h:message for="editora" errorStyle="color:red"/>
      </td>

Código da classe LivroController que obtem os dados da tabela.

public Livros getLivroFromEditOrDelete()
    {
        livro = (Livros) model.getRowData();

        return livro;
    }

    public String editar()
    {
        livro = getLivroFromEditOrDelete();
        setLivro(livro);
        

        return "editar";
    }

6 Respostas

V

Carinha. dá pra você atualizar o valor do selectOneMenu no seu Controller.

Para isso faça um binding do select com uma propriedade no seu Controller.

public class LivrosController{
...
private HtmlSelectOneMenu seuComboDeEditoras
... getter e setter ...
}
<h:selectOneMenu  value="#{livrosC.livro.editora_id}" name="editora" id="editora" 
       binding="#{livros.seuComboDeEditoras}">

E ao selecionar o livro atualizar o value do combo:

.. // atualiza o livro com o livro selecionado e depois atualiza o combo
seuComboDeEditoras.setValue(livro.getEditoraId());
seuComboDeEditoras.setSubmittedValue(livro.getEditoraId().toString());
// se nao colocar a linha abaixo, após alterar o valor, o evento de value change do combo é disparado!!!!
seuComboDeEditoras.setLocalValueSet(false);
T

Olá v1c70r_f,

muito obrigado pela ajuda. Está funcionando! :slight_smile:

V

Opa, é nóis!!!

Só um detalhe carinha, quando puder dá uma editada no título do post e coloca como RESOLVIDO, bl?

Vlw, abraço o/

M

Boa noite,

Tiago A, o código :

… // atualiza o livro com o livro selecionado e depois atualiza o combo

seuComboDeEditoras.setValue(livro.getEditoraId());

seuComboDeEditoras.setSubmittedValue(livro.getEditoraId().toString());

// se nao colocar a linha abaixo, após alterar o valor, o evento de value change do combo é disparado!!!

seuComboDeEditoras.setLocalValueSet(false);

você colocou no método set do seuComboDeEditoras?

Meu problema é o seguinte:

fiz o exemplo completo criando o objeto “publicacao” que reúne autor, livro e editora…

Então fiz da forma que vcs estavam trabalhando e no meu caso houve um comportamento estranho, toda vez que clico na listagem (para editar uma publicacao), é acionada uma tela onde tem 3 SelectOneMenu, para Autor, Livro e Editora, só que quando a tela é carregada o valor da editora é sempre o valor anterior. ex: se clico para editar uma publicacao com a editora “A” no SelectOneMenu é carregado outra editora, daí quando volto para tela de listagem e clico em outra editora, daí o componente é carregado com a editora “A” (anterior), isto é, para ver a editora certa tenho que clicar uma vez, voltar e clicar de novo na mesma editora para preencher com o SelectOneMenu da tela de alteração com o valor correto. Entende?

Gostaria de saber se vc passou por algo similar, se sim, como resolveu.

Grato pela atenção!

V

Olá mheitor.

Bom vou tentar sanar sua dúvida.

Tenha isso como premissa: NUNCA coloque comportamento dentro de métodos set e get utilizados pelo JSF. Utilize set e get apenas para retornar um atributo, e caso precise, para decorá-lo.

Ok, levando isso em consideração, já sabe que o código citado não foi colocado no método set. _o/

O cenário é o seguinte: se o usuário selecionar um livro, o combo de editoras é atualizado com a editora do livro selecionado.

Sendo assim, o código mencionado ficará no método definido para o evento valueChanged do livro. Assim alterando o valor do livro vc pega a editora do livro selecionado e altera o valor do combo de editoras.

Espero que tenha ficado um pouco mais claro, qualquer coisa dá um toque.

Abraço.

M

v1c70r_f.

Valeu mesmo, deu certo agora! \O/ \O/ \O/

Criado 15 de dezembro de 2010
Ultima resposta 29 de abr. de 2011
Respostas 6
Participantes 3