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

BiraBoy

É algo que gostaria de saber também

maurenginaldo

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,

BiraBoy

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

maurenginaldo

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;
BiraBoy

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

lionels

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 …

klayrocha

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 ?

klayrocha

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

tyemy

.

carlos.scuna

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???

Nabas

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