JSF - Como manipular componente da página no MB? [RESOLVIDO]

3 respostas
HarfangDesNeiges

Tenho uma página com componente DataTable <rich:dataTable id="tbMensagens" ...> e, para cada linha da tabela, existe uma coluna com checkbox. Associada à esta tabela, tenho um componente de navegação <rich:datascroller for="tbMensagens" maxPages="10" /> Ele funciona até bem. Porém tenho um problema com o seguinte componente: Criei um outro checkbox que equivale a um “Selecionar Todos”. A questão é que agora, com o datascroller, quando marco esse “Selecionar Todos” não só os elementos da página atual como todos das demais páginas (não visíveis no momento) são selecionadas.

Como faço para que, ao clicar no “Selecionar Todos”, apenas as linhas atuais (visíveis na página) sejam selecionadas?

Em outras palavras, como fazer para que eu consiga manipular um componente da página no Managed Bean?

Ou existe um próprio recurso de algum componente que resolva esta situaçaõ?

Se alguém puder explicar melhor, agradeço… inclusive com um exemplo para ficar mais elucidativo, já que sou meio amarrado em JSF e se me responderem “faça isso utilizando tal componente com tal comando” não ficaria tão claro… Obrigado.

3 Respostas

danielbussade

Olá, não entendi muito bem sua dúvida, mas para manipular componentes no BackingBean, deve usar o atributo binding, e apontar para o seu componente no BackingBean.

Lembrando de gerar getter e setters para este componente no seu BackingBean.

HarfangDesNeiges

danielbussade:
Olá, não entendi muito bem sua dúvida, mas para manipular componentes no BackingBean, deve usar o atributo binding, e apontar para o seu componente no BackingBean.

Lembrando de gerar getter e setters para este componente no seu BackingBean.

Bom, realmente tinha que fazer isso: Associar a um backing bean usando o atributo binding além de gerar os getters e setters. Valeu… Mas a dúvida ainda persiste.

Tenho uma tabela onde cada linha[color=red]*[/color] tem um checkbox. O problema é que quero fazer um comando “selecionar todas” para selecionar todas as linhas da página atual (todos os checkbox da página atual estariam marcados), e não de todas as linhas, inclusive as não visíveis no momento (ou seja, as que estão em outra página). Quando fala página é por que estou usando o componente Scroller.

EXEMPLO: Supondo que sejam 36 mensagens, um máximo de 10 linhas por página, e eu esteja na quarta (e última) página. Se eu clicar em “selecionar todas” neste momento quero selecionar apenas as linhas 31 a 36 e não todas.

Como saber quantas e quais linhas estão ativas?

[color=red]*[/color] E tem outro agravante: na verdade não é em cada linha da tabela que tenho um checkbox. Pra cada linha com checkbox existem 2 outras que são o detalhamento da linha com o checkbox. Basta imaginar como se fosse um serviço de webmail, onde cada linha é um email e se ele marcar alguns emails e clicar em “exibir” ele expandirá as selecionadas. O “Selecionar Todas” irá expandir todos os emails da página atual. Acredito que isso não seja o problema. Acho que dará pra fazer algum cálculo para desconsiderar estas linhas. O problema é saber como saber a quantidade de linhas atualmente visíveis e o índice da primeira linha visível.

HarfangDesNeiges

Bom, depois de várias tentativas, acabei criando mais 1 propriedade (com seus getter e setter) e 1 método no ManagerBean:

Propriedade:
/**
     * Recupera o DataTable da página JSF.
     */
    public HtmlDataTable tbLinhas;
Método:
/**
     * Marca todos os checkboxs da pagina atual.
     * @return alias para a pagina atual (null)
     */
    public String marcarTodasPaginaAtual() {exibirMensagens_exibir
       
       // Descricao dos Metodos (nao existe JavaDoc).
       // getFirst    : retorna o indice do primeiro elemento da pagina atual;
       // getRowCount : retorna o numero de total de itens (todas as paginas);
       // getRows     : retorna o numero de itens por pagina (definido em exibirMensagens_exibir.xhtml.tbMensagens.rows = 25);
        
       int indiceItemInicial = tabela.getFirst();

       //                       Se página atual não for a última...
       int indiceItemFinal = (( tabela.getRowCount()-1 ) > ( tabela.getFirst() + tabela.getRows() ) ? 
                              ( tabela.getFirst() + tabela.getRows() ) - 1 : 
                                tabela.getFirst() + ( tabela.getRowCount() - tabela.getFirst() -1 ));
       
       for(int i=indiceItemInicial; i <= indiceItemFinal; i++) {
           final LinhaDTO linhaDTO = linhas.get(i);
           linhaDTO.setMarcada(this.todas);
       }
        return null;
    }
Criado 16 de junho de 2009
Ultima resposta 19 de jun. de 2009
Respostas 3
Participantes 2