Tenho uma tabela onde tenho que mesclar células utilizando rowspan. Sendo que a coluna 1 desta tabela possui vários linhas com nomes iguais , quero usar o rowspan para mesclar as informações repetidas. Sendo que na hora que monto a tabela do lado do C#, tenho um loop para pegar todas as colunas e para cada coluna atribui o conteúdo da linha, assim:
Percorrendo todas as colunas e recebendo o conteúdo:
for (int i = 0; i < colunasArray.Length; i++)
{
if (colunasArray[i] == null)
colunasArray[i] = td();
}
Sendo que para algumas colunas tenho que pegar apenas a 1º célula da linha(mesclar) para não pegar repetição, por exemplo:
Nome: Flavia Flavia Flavia Flavia
Quero que fique assim com rowspan:
Nome: Flavia
Já estou utilizando o rowspan, mas ele está pegando linha por linha no for, então pega o conteúdo mescla e joga as repetições para as demais colunas. Como pegar apenas a 1º celula da coluna e ignorar as demais?
for (int i = 0; i < colunasArray.Length; i++)
{
if (colunasArray[i] == null)
{
colunasArray[0] = td(noFiltrado.Item).attr($":first-child rowspan = {linhasArray.Length}");
colunasArray[1] = td();
}
}
Mas continua pegando as repetições , ele mescla mas repete as informações nas demais colunas. Tenho que ignorar as demais linhas e exibir só a primeira linha da coluna. Não estou conseguindo fazer isso, é possível?
Mas você quer mesclar colunas ou linhas? O Rowspan mescla linhas, certo? Se é para merclar linhas com mesmo conteúdo, desde que sequenciais, por que o for nas colunas? Basta indicar a coluna 0.
Quero mesclar as linhas com rowspan. O for está montando a tabela com as colunas, sendo que algumas colunas tenho que mesclar, achei que poderia percorrer as colunas e para cada coluna filtrar o td que é conteúdo das linhas , no caso que passei acima tentei filtrar com o first-child para pegar a primeira linha da coluna.
Para a primeira coluna mesclo o atributo Nome pelo número de linhas da tabela. Ele realiza a mesclagem, mas como tenho vários nomes iguais nas demais linha da coluna 0 ele joga a repetição para a coluna 1 e se tiver mais repetições joga para a coluna 2.
Desta forma monto um por um dos td da tabela.
Para montar a tabela , faço:
for (int i = 0; i < colunasArray.Length; i++)
{
if (colunasArray[i] == null)
colunasArray[i] = td();
}
Por este motivo queria uma forma de bloquear o aparecimento das demais linhas da coluna 0 e exibir apenas a primeira linha. Teria algum atributo para isso?
@Flavia1, o que o @wldomiciano pediu foi para você mostrar um exemplo visual, uma tabela pronta, do jeito q você gostaria que ficasse.
Eu estou sem tempo, mas, já imagino como fazer:
Você precisa de um vetor para cada coluna que deseja mesclar as células. Em cada posição do vetor, irá indicar qual é o conteúdo da célula e qual o total de repetições deste valor (quantas células contém o mesmo valor), bem como qual a primeira célula referente ao tal valor.
Depois que tiver isso tudo contabilizado, basta, a partir da célula inicial daquele determinado valor, definir o valor do colspan ou rowspan
Compreendi, poderia dar um exemplo na prática.
No meu caso a 1º coluna da tablela todos os valores são repetidos, sendo assim seria apenas aplicar o rowspan pelo número de linhas da tabela, e as demais colunas que se repetem também repete até o fim de linhas da tabela.
E como determino qual a primeira célula referente ao tal valor?
Desculpe algumas perguntas é que sou iniciante na área.
Geralmente, a primeira célula é a combinação da linha 0 com a coluna 0, né?
Agora, você pode ter outros valores em outras linhas, então, eu faria algo como:
var tbl = document.getElementById('tbl');
var igual = "";
var equals[] = new Array();
for(var i = 0; i < tbl.rows.length; i++) {
var row = tbl.rows[i];
for(var j = 0; j < row.cells.length; j++) {
var value = row.cells[j].innerHTML;
if("" === igual || igual != value) {
igual = value; //a primeira iteração ou quando o valor muda, identifica qual o novo valor igual
} else {
//Aqui conta quantas repetições determinado valor possui
}
}
}
Este código funciona para montagem de duas linhas, quando passa de duas linhas, no caso deste html onde tenho 4 linhas - o que está ocorrendo é que no final a linha 3 sobrescreve a linha 2 e a linha 4 sobrescreve a 2,3.
No final a montagem que aparece é a seguinte:
<th>Empresa</th>
<th>Unidade</th>
<th>Cargo</th>
<th>Nome</th>
<th>Observação</th>
<tr><td rowspan="4">Google</td>
<td>Unidade Teste</td>
<td rowspan="4">Analista de Sistemas</td>
<td>Teste</td>
<td rowspan="4">Observação</td>
</tr>
<tr>
<td hidden>Google</td>
<td>Unidade Teste 2</td>
<td hidden>Analista de Sistemas</td>
<td>Teste 3</td>
<td hidden>Observação</td>
</tr>
<tr>
<td hidden>Google</td>
<td>Unidade Teste 2</td>
<td hidden>Analista de Sistemas</td>
<td>Teste 3</td>
<td hidden>Observação</td>
</tr>
<tr>
<td hidden>Google</td>
<td>Unidade Teste 2</td>
<td hidden>Analista de Sistemas</td>
<td>Teste 3</td>
<td hidden>Observação</td>
</tr>
</table>
Repare que a linha 2 e 3 foi sobrescrita pela 4. O que estou fazendo de errado?
A primeira, a terceira e a quinta colunas sempre serão mescladas até a última linha? (Por exemplo, numa tabela com 100 linhas, essas colunas sempre terão que ter o rowspan igual a 100?)
Qual é o tipo da variável linhasArray e da variável noFiltrado? Se for de uma classe que vc criou, vc poderia mostrar o código desta classe?
Que biblioteca ou framework vc está usando que tem esses métodos tr(), td(), attr()…
Quanto mais vc puder mostrar do seu código, melhor pra nos ajudar a entender seu problema.
Sim. Essas colunas possuem dados repetidos e devem ser mesclados.
linhasArray é do tipo DomContent do HtmlFlow.tags e noFiltrado é uma classe que eu criei para pegar os campos da tabela.
HtmlFlow
Chegou a executar 1º html(isto é o esperado) que enviei? O 2º html é o código que obtive como resultado do C#, que a forma como fiz ele preserva a linha 0 e para as demais linhas ele sempre sobrescreve.
A minha ideia é dar um rowspan na primeira linha da tabela e esconder(hidden) as demais repetidas.
Realmente sem ver mais código pra entender o contexto todo, fica dificil pra eu te ajudar de forma decente.
Mas com base só no trecho que vc mostrou, eu chuto que o problema é que no loop vc está adicionando sempre os itens 1 e 3 do array colunasArray, ou seja, vc está adicionando sempre o mesmo valor. Tem que ver melhor essa parte.
Eu queria montar na minha máquina um ambiente parecido com o seu pra fazer testes, mas buscando por “HtmlFlow”, não consegui encontrar nada pra C#, apenas pra Java que é essa do link abaixo. Qual é o link pra essa ferramente do C#?