Pegar linha selecionada em um rich:DataTable

8 respostas
S

Tenho um rich:combobox, em cada linha de uma DataTable. Quero pegar o valor da linha da DataTable, que contem a combobox que foi alterada.
Já tentei algumas coisas que vi na net mas nada até agora. Alguem tem um exemplo que funcione para eu começar?
No momento o codigo da DataTable está assim:

<rich:dataTable value="#{setaClasseBack.tipos}" var="tipo" id="tableTipos"
                                              onRowContextMenu="row=this;">

                                    <h:column>
                                        <f:facet name="header">
                                            <h:outputText value="Função"/>
                                        </f:facet>
                                        <h:outputText value="#{tipo.fun}" id="fun"/>
                                    </h:column>

                                    <h:column>
                                        <f:facet name="header">
                                            <h:outputText value="Tipo"/>
                                        </f:facet>
                                        <h:outputText value="#{tipo.tipo}" id="tipo"/>
                                    </h:column>

                                    <h:column>
                                        <f:facet name="header">
                                            <h:outputText value="Descrição"/>
                                        </f:facet>
                                        <h:outputText value="#{tipo.desc}" id="desc"/>
                                    </h:column>

                                    <h:column>
                                        <f:facet name="header">
                                            <h:outputText value="Classe"/>
                                        </f:facet>
                                        <rich:comboBox value="#{tipo.classe}">
                                            <f:selectItems value="#{setaClasseBack.cbClassesItems}"/>
                                            <a4j:support event="onchange" actionListener="#{setaClasseBack.setaClasse}">
                                                <f:setPropertyActionListener value="#{tipo}" target="#{setaClasseBack.pTipo}"/>
                                            </a4j:support>
                                        </rich:comboBox>
                                    </h:column>
                                 
                             </rich:dataTable>

Mas como disse não funfa.
Se tiver um jeito mais facil ou apenas me indicar os erros desse, está otimo.
Muito obrigado.

8 Respostas

surfzera

você está esquecendo de fazer um binding na tabela.

surfzera

com esse binding você poderá chamar o metodo getRowData() para pegar a linha selecinado quando você der um onchange

Binding:

private HtmlDataTable table;

//get sets omitidos

depois fazer mais ou menos assim:

private void pegalinha(){

Object objecto =  table.getRowData();

return objecto;

}

acho que a ideia é essa … qualquer coisa estamos ai

S

Putz cara não funcionou. Esse objeto é do tipo que eu usei para popular a datatable, no meu caso uma classe tipo?
E como eu faço para invocar essa ação de pegar o valor da linha, tenho que usar um a4j:suport com um event=“onclick”?
Obrigado

surfzera

sim você deve usar o a4j:support mais com o event=“onchange” e o action dele apontando para o metodo pegaLinha.

surfzera

outro exemplo pega linha :

public Cliente pegaLinhaSelecionada(){

Cliente cliente1 = (Cliente) table.getRowData();

System.out.println(cliente1.getNome);

return object1;

}
roland

Eu acho que não é necessário fazer binding.
Já fiz isso usando o getRowData() do DataModel.
Tipo

...
private DataModel model;
private Usuario user;
public Usuario getUsuario(){
       user = (Usuario) model.getRowData();
       return user;
}

Eu fiz e deu certo, mas claro, devem existir outras maneiras tb. O detalhe do código
que eu coloquei aqui é que é necessário fazer cast do model.

surfzera

exatamente… o DataModel é outro tipo de forma de armazenar objetos para um tabela.

Eu havia esquecido de mencionar o Cast … mais enfim qualquer coisa estamos ai para ajudar.

Bom que Funcionou.

Abraço

S

roland:
Eu acho que não é necessário fazer binding.
Já fiz isso usando o getRowData() do DataModel.
Tipo

...
private DataModel model;
private Usuario user;
public Usuario getUsuario(){
       user = (Usuario) model.getRowData();
       return user;
}

Eu fiz e deu certo, mas claro, devem existir outras maneiras tb. O detalhe do código
que eu coloquei aqui é que é necessário fazer cast do model.

Como vc fez para amarrar o model à tabela?

Então fiz funcionar de outro jeito, umas gambiarras nojentas, depois arrumo. Mas, de qqr forma, gostaria de saber, se há alguma forma de atualizar o valor de um SelectOneMenu pelo a4j:commandbutton? Pq quando uso o a4j:commandbutton ele não atualiza o valor do selectOne no backingbean, então, acabei usando o h:commandbutton mas, ele é lento pq atualiza a pag. inteira.
Obrigado.

Criado 17 de maio de 2010
Ultima resposta 19 de mai. de 2010
Respostas 8
Participantes 3