Pegar a primeira linha da coluna e ignorar as demais

Boa tarde pessoal.

Estou com uma dúvida, é o seguinte:

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:

Campo que quero mesclar:

colunasArray[3] = td(noFiltrado.Item.Nome + " (" + pessoa.Nome + “)”).attr($“rowspan = {linhasArray.Length}”);

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?

Obrigada, Flávia

Tentou verificar o índice da coluna (a combinação de linha e coluna é que determinam uma célula)?

if(col == 0) {

Bom dia Darlan.

Tentei fazer desta forma:

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?

Obrigada.
Flávia

Obrigada

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.

Oi.

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.

Obrigada.
Flávia

Não tenho apenas 1 coluna, tenho 7 colunas e tenho que mesclar 4.

Para cada coluna tenho que mesclar linhas repetidas. Não sei se consegui ser clara.

Desde já agradeço.
Flavia

Alguém poderia me ajudar?

Obrigada.
Flavia

Vc pode dar um exemplo visual do que vc tem hoje e do resultado que gostaria de alcançar?

Faço assim, veja um pouco do meu código:

colunasArray[0] = td(noFiltrado.Item.Nome).attr($“rowspan = {linhasArray.Length}”);

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?

Obrigada.
Flávia

@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

1 curtida

Oi Darlan.

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.

Desde de já agradeço sua atenção.

Flavia

Sim.

Tinha entendido que era apenas a primeira coluna.

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

Ok. Vou tentar com base no que passou.
Neste caso onde entra o rowspan?

Vou ter que substituir o for de colunas pelo for de linhas, pois antes eu exibia a tabela com tudo sem mesclar.

Obrigada. Vou tentar e te dou um retorno.
Flavia

Após a contagem de células repetidas, você identifica a primeira célula e nela define quanto de rowpan você precisa.

Oi pessoal.
Ainda não cheguei em uma solução, mas estou quase lá.

O que quero fazer é o 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 1</td>
   <td hidden>Analista de Sistemas</td>
   <td>Teste 1</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 2</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>

Sendo que tenho que fazer isto em C#, tentei assim:

				if (linhasArray[0] == null)
				{

					linhasArray[0] = tr(td(noFiltrado.Item.Empresa).attr($"rowspan = {linhasArray.Length}"),
					colunasArray[1],
					td(noFiltrado.Item.Cargo).attr($"rowspan = {linhasArray.Length}"),
				
					colunasArray[3],
										td(noFiltrado.Item.Observacao).attr($"rowspan = {linhasArray.Length}"));



				}
				for (int row = 0; row < linhasArray.Length; row++)

				{
				linhasArray[row] = tr(td(noFiltrado.Item.Empresa).attr("hidden"),
					colunasArray[1],
					td(noFiltrado.Item.Cargo).attr("hidden"),
				
					colunasArray[3],
										td(noFiltrado.Item.Observacao).attr("hidden"));

				}


			}

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?

Quero fazer exatamente o que fiz no 1º html.

Obrigada Flavia.

Bom dia.

Alguém poderia me ajudar?

Desde já agradeço.

Olá, eu tenho algumas perguntas:

  1. 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?)
  2. 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?
  3. Que biblioteca ou framework vc está usando que tem esses métodos tr(), td(), attr()
  4. Quanto mais vc puder mostrar do seu código, melhor pra nos ajudar a entender seu problema.

Oi.
Respondendo as suas perguntas:

  1. Sim. Essas colunas possuem dados repetidos e devem ser mesclados.
  1. linhasArray é do tipo DomContent do HtmlFlow.tags e noFiltrado é uma classe que eu criei para pegar os campos da tabela.
  2. 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.

Muito Obrigada.

Olhando seu código, a principio achei que tive algo errado com ele, mas formatando-o eu cheguei ao trecho abaixo e tudo começou a fazer mais sentido:

if (linhasArray[0] == null) {
    linhasArray[0] = tr(
        td(noFiltrado.Item.Empresa).attr($"rowspan = {linhasArray.Length}"),
        colunasArray[1],
        td(noFiltrado.Item.Cargo).attr($"rowspan = {linhasArray.Length}"),
        colunasArray[3], 
        td(noFiltrado.Item.Observacao).attr($"rowspan = {linhasArray.Length}")
    );
}

for (int row = 0; row < linhasArray.Length; row++) {
    linhasArray[row] = tr(
        td(noFiltrado.Item.Empresa).attr("hidden"),
        colunasArray[1],
        td(noFiltrado.Item.Cargo).attr("hidden"),
        colunasArray[3],
        td(noFiltrado.Item.Observacao).attr("hidden")
    );
}

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

https://htmlflow.org/