Criar um dataTable com numero de colunas dinamica

14 respostas
L

Bom dia pessoal, tem como eu criar colunas dinamicas num dataTable de um jsf? do tipo, leio uma List ou array de colunas e monto ela no jsf?? isso porque eu quero usar o mesmo jsf e datatable para listar varios tipos de objetos com difenrente numero de colunas…

obrigado…

14 Respostas

B

É algo que gostaria de saber também

M

Oi pessoal, tive esse problema há tempos atrás, ralei a beça mais consegui resolver.
tem como vcs fazerem assim:

<rich:dataTable value="#{bean.dataModelList}" var="linha"> <f:facet name="header"> <rich:columnGroup> <c:forEach var="coluna" items="#{bean.listaColunas}"> <h:outputText value="#{coluna.label}"/> </c:forEach> </rich:columnGroup> </f:facet> <!-- Coloque aqui seus valores baseado no objeto linha --> </rich:dataTable>

Porém, o problema vai aparecer quando vcs forem colocar o valor do objeto, baseado em cada atributo dele.
Fiz uma implementação igual a de cima, porém no componente rich:columnGroup eu criei um binding e fiz ele no java, ficando bem mais facil, mais ou menos assim:

<rich:dataTable value="#{bean.dataModelList}" var="linha"> <f:facet name="header"> <rich:columnGroup binding="#{bean.colunasLabel}"> </f:facet> <rich:columnGroup binding="#{bean.colunasValor}"> </rich:dataTable>

Assim, a tabela ficou totalmente dinâmica.
Recomendo a segunda opção.

Qualquer dúvida postem aí.
Abraços,

B

Mostra como seria o código do bean pra se ter uma idéia

M

Ta na mão:

HtmlOutputText valor;
		HtmlColumn coluna;
		HtmlColumnGroup colunaGrupo = new HtmlColumnGroup();
		ValueBinding valorBinding;

		for (Coluna coluna : listaColunas) {
			coluna = new HtmlColumn();
			valor = new HtmlOutputText();
			valorBinding = FacesContext.getCurrentInstance().getApplication()
					.createValueBinding("#{bean." + <nome_atributo_classe> + "}");
			valor.setValueBinding("value", valorBinding);
			coluna.getChildren().add(valor);
			colunaGrupo.getChildren().add(coluna);
		}

		return colunaGrupo;
B

Valeu irmão

J

Tambem estou com o mesmo problema de precisar de uma tabela com numero de colunas variaveis e experimentei o seu codigo: mas deu o seguinte erro:

java.lang.IllegalArgumentException: Component statForm:dataTable:columnTitle not instance of org.richfaces.component.UIColumnGroup

O meu codigo é o seguinte:
em XHTML
<f:facet name=“header”>
<rich:columnGroup id=“columnTitle” binding="#{ofertasEmpregoStatReport.colunasLabel}"/>
</f:facet>

JAVA

()

import javax.faces.component.html.HtmlOutputText;

import javax.faces.component.html.HtmlColumn;

import org.richfaces.component.html.HtmlColumnGroup;

import javax.faces.el.ValueBinding;

import javax.faces.context.FacesContext;

()

public HtmlColumnGroup getColunasLabel() {

if(this.results.size()==0){

this.initColunasLabel();

}

HtmlOutputText valor;

HtmlColumn coluna;

HtmlColumnGroup colunaGrupo = new HtmlColumnGroup();

ValueBinding valorBinding;

int numColunas = this.results.get(0).size();

for(int i=0;i<numColunas;i++){

coluna = new HtmlColumn();

valor = new HtmlOutputText();

log.info("[getColunasLabel] coluna:#0 valor:#1", i,results.get(0).get(i).toString());

valorBinding = facesContext.getCurrentInstance().getApplication().createValueBinding(results.get(0).get(i).toString());

valor.setValueBinding(value, valorBinding);

<a href="//valor.setValue">//valor.setValue</a>(results.get(0).get(i).toString());

coluna.getChildren().add(valor);

colunaGrupo.getChildren().add(coluna);

}

colunasLabel = colunaGrupo;

return colunasLabel;

}

tem alguma ideia do que poe estar mal aqui?

Grato pela sua resposta

Jose Meireles

L

NAO SEI SE ALGUEM AINDA ACOMPANHA ESTE POST MAS VAI AI UMA SOLUCAO
DA PRA USAR O COMPONENTE DO TOMAHAWK O T:DATATABLE E O T:COLUMNS
O T:COLUMNS FUNCIONA COMO QUALQUER DATATABLE

J

Agradeço a resposta, mas acabei por abandonar esta abordagem. estou a criar este dinamismo dentro do das paginas xml usando a tag <c:forEach …

K

Alguém sabe como resolver os erros apresentados anteriormente ?

Na verdade não estou entendendo como implementar, teria como me da um exemplo mais completo ?

K

Mas como faria para colocar as colunas e os valores dinâmicos ?

T

.

C

Muito mais fácil utilizar o rich:columns do RichFaces:

&lt;rich:dataTable value="#{produtoQueries.results}" var="_r" style="width: 100%"&gt;

	&lt;rich:columns value="#{produtoQueries.colunas}" var="coluna"&gt;
		&lt;f:facet name="header"&gt;
			&lt;h:outputText value="#{coluna}" /&gt;
		&lt;/f:facet&gt;

		&lt;h:outputText value="#{_r[coluna]}" /&gt;

	&lt;/rich:columns&gt;

&lt;/rich:dataTable&gt;

att

C

pessoal, nao sei se alguem ainda entra nesse tópico…estou com um problema “parecido” com o de vocês e ando procurando uma solução na internet!
tenho uma tabela e um botão escrito “adicionar coluna”…cada vez q o usuário clicar nesse botão, uma coluna é adicionada na tabela…

como posso fazer isso???

N

olá pessoal,
carlos.scuna e demais amigos, estou com este problema das colunas e percebo que sua solução resolveria meu caso, mas não entendi direito como ficaria esse objeto results e o objeto colunas.
vamos supor que eu tenha que fazer carros vendidos por ano… e que as colunas variaveis seriam os anos.

Como ficaria os objetos(result e colunas) pra que este columngroup faça este vinculo corretamente.

Desde já agradeço o pessoal que colaborar

Criado 20 de junho de 2006
Ultima resposta 22 de jan. de 2012
Respostas 14
Participantes 10