none
Datagridview limitar visualização de linhas. RRS feed

  • Pergunta

  • Fala pessoal, estou com uma duvida.

    existe alguma maneira de realizar um filtro e suprimir a visualização das linhas de um datagridview.

    estou usando C# e windowsforms.

    Att.Fabio.

    quarta-feira, 27 de abril de 2016 14:24

Respostas

  • Boa noite,

    Acredito que entendi e se não me falha a memória eu dei uma dica de como duplicar as linhas em outro "DataGridView". 
    Quanto ao método apresentado anteriormente eu realizei diversos testes e não apresentou erro, pode ser que você esqueceu de renomear todos os DataGridView pois é fácil confundir por ter dois componentes, nas em fim....

    Fabio, você não poderia fazer isso na hora de preencher o DataGridView2 ?
    Se você utilizou o exemplo que passei, poderia fazer assim:

    int index = 0;
    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        int qtde = Convert.ToInt32(row.Cells[1].Value);
        for (int i = 0; i < qtde; i++)
        {
            string tipo = row.Cells[3].Value.ToString();
            this.dataGridView2.Rows.Add(row.Cells[0].Value, row.Cells[1].Value, row.Cells[2].Value, row.Cells[3].Value);
            if (i > 0 && (tipo.Equals("N/I") || tipo.Equals("Auto")))
                dataGridView2.Rows[index].Visible = false;
    
            index++;
        }
    }
    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Marcado como Resposta fabio_costa0311 quinta-feira, 28 de abril de 2016 13:08
    quinta-feira, 28 de abril de 2016 02:20

Todas as Respostas

  • Bom dia,

    Fabio, você pode aplicar o filtro quando for fazer a consulta no banco. Ou seja a consulta retorna os registros que você quer mostrar.
    Mas caso você deseja ocultar a linha do DataGridView, você pode percorrer as linhas e ocultar as desejadas, como no exemplo:

    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
                   
        //Filtro na coluna 0
        if (row.Cells[0].Value.ToString().Equals("filtroDesejadoNaColuna1"))
        {
            dataGridView1.CurrentCell = null;
            dataGridView1.Rows[row.Index].Visible = false;
        }
    }

    Espero ter ajudado.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quarta-feira, 27 de abril de 2016 14:51
  • Oi Silvaney. Os dados continuariam a existir só não seriam mostrados certo. 


    quarta-feira, 27 de abril de 2016 15:04
  • No exemplo ilustrado acima sim. Só oculta a linha.
    Não é isso que gostaria?

    Att,

     

    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quarta-feira, 27 de abril de 2016 15:10
  • Este datagridview recebe mais de uma linha para o mesmo registro.

    exemplo: produtos que podem ter um identificador unico com um serial. e outo produto que não tenha esse identificador. esse datagrid carrega esse dois produtos. multiplicando as linhas pela quantidade de produtos recebidos. da forma que criei o datagrid esta recebedo 10 linhas, sendo 5 da calçaA e 5 da calçaB mas a calçaB este "serial" é N/a dai o filtro para mostrar 5 linhas da calçaA e 1 linha da calçaB .

    CalçaA | 12,90 | *serial 123455 

    CalçaA | 12,90 | *serial  53434

    CalçaA | 12,90 | *serial  63636

    CalçaA | 12,90 | *serial  73873

    CalçaA | 12,90 | *serial  9393

    CalçaB | 17,90 | N/a 

    quarta-feira, 27 de abril de 2016 15:25
  • Boa tarde,

    Fábio segue o exemplo que acredito que vai resolver seu problema. O método abaixo o culta as linhas duplicadas, mas se você quiser remover as linhas, só tirar o comentário "dataGridView.Rows.Remove(row)" e comentar as duas linhas abaixo:

    private void OcultarLinhasDuplicadas()
    {
        for (int currentRow = 0; currentRow < dataGridView.Rows.Count - 1; currentRow++)
        {
            DataGridViewRow rowToCompare = dataGridView.Rows[currentRow];
    
            for (int otherRow = currentRow + 1; otherRow < dataGridView.Rows.Count; otherRow++)
            {
                DataGridViewRow row = dataGridView.Rows[otherRow];
    
                bool duplicateRow = true;
    
                for (int cellIndex = 0; cellIndex < row.Cells.Count; cellIndex++)
                {
                    if (!rowToCompare.Cells[cellIndex].Value.Equals(row.Cells[cellIndex].Value))
                    {
                        duplicateRow = false;
                        break;
                    }
                }
    
                if (duplicateRow)
                {
                    //dataGridView.Rows.Remove(row);
                    dataGridView.CurrentCell = null;
                    dataGridView.Rows[row.Index].Visible = false;
                }
            }
        }
    }

    Espero ter ajudado.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.


    • Editado Silvaney quarta-feira, 27 de abril de 2016 17:41 Correção
    • Sugerido como Resposta Silvaney quarta-feira, 27 de abril de 2016 19:44
    quarta-feira, 27 de abril de 2016 17:40
  • Oi silvaney, 

    este trecho esta dando erro  referencia de objeto não definida para uma instancia do objeto

    if (!rowToCompare.Cells[cellIndex].Value.Equals(row.Cells[cellIndex].Value))

    Apesar, de achar que não esclareci bem meu problema.

    Vou postar assim que acredito que fique fique facil.

    No datagridview é como eu carrego os dados, ai o usuario seleciona no combobox o qual o tipo desse produto, N/I (não informado) , Serial , Automatico. quando ele termina de informar passo esse dados para outro datagridview (dt1)

    que recebe multiplicando os registros pela quantidade então calçaA tem 2 (campo Qtd)  o datagridview1 recebe duas linhas do mesmo produto. só que este produto recebeu N/I então ele não precisa mostrar 2 linhas somente 1. 

    calçaB foi setado com serial dai no campo1 o usurio iria colocar o serial de cada peça. esse eu preciso que carregue as 4 linhas pq os seriais serão diferentes. CamisaA é o mesmo caso de calçaA só preciso que apareça 1 linha. não preciso excluir nenhuma linha do datagriview1 somente ocultar a quantidade de linhas > 1 da condição == N/I e Automatico.

    Obrigado pela ajuda, e peço desculpas se te fiz entender errado, meu problema.

    Att Fabio. 

     

    quinta-feira, 28 de abril de 2016 01:06
  • Boa noite,

    Acredito que entendi e se não me falha a memória eu dei uma dica de como duplicar as linhas em outro "DataGridView". 
    Quanto ao método apresentado anteriormente eu realizei diversos testes e não apresentou erro, pode ser que você esqueceu de renomear todos os DataGridView pois é fácil confundir por ter dois componentes, nas em fim....

    Fabio, você não poderia fazer isso na hora de preencher o DataGridView2 ?
    Se você utilizou o exemplo que passei, poderia fazer assim:

    int index = 0;
    foreach (DataGridViewRow row in this.dataGridView1.Rows)
    {
        int qtde = Convert.ToInt32(row.Cells[1].Value);
        for (int i = 0; i < qtde; i++)
        {
            string tipo = row.Cells[3].Value.ToString();
            this.dataGridView2.Rows.Add(row.Cells[0].Value, row.Cells[1].Value, row.Cells[2].Value, row.Cells[3].Value);
            if (i > 0 && (tipo.Equals("N/I") || tipo.Equals("Auto")))
                dataGridView2.Rows[index].Visible = false;
    
            index++;
        }
    }
    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    • Marcado como Resposta fabio_costa0311 quinta-feira, 28 de abril de 2016 13:08
    quinta-feira, 28 de abril de 2016 02:20
  • Oi Silvaney. Sim vc me ajudou. Alias mais de uma vez. rsrsrs. inclusive no class datatable lembra. 

    Vou testar aqui e já te retorno.

    quinta-feira, 28 de abril de 2016 02:32
  • Que bom que consegui ajudar. Lembro sim rsrsr.

    Beleza, qualquer coisa pode postar.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 28 de abril de 2016 02:35
  • Oi silvaney, bom dia.

    Funcionou de boa.

    Mais um vez muito obrigado. 

    att, fabio.

    quinta-feira, 28 de abril de 2016 13:08
  • Bom dia,

    Por nada, fico feliz por ajudar a resolver o problema.

    Att,


    Se a resposta contribuiu com seu aprendizado por favor marque como util, se solucionou seu problema marque como resposta.

    quinta-feira, 28 de abril de 2016 13:22