none
Problema ao excluir linhas de DataGridView com DataGridViewCheckBox selecionado RRS feed

  • Pergunta

  • Boa noite a todos.

    Bem, estou trabalhando em um Windows Form que utiliza uma DataGridView que possui uma DataGridViewCheckBoxColum.

    Possuo um botão para excluir as linhas da grid que estiverem selecionadas pelo checkbox, porém, quando seleciono várias linhas através dos checkboxes, uma linha acaba sendo não excluída. Segue abaixo meu código:

    Botão excluir:

    private void btnExcluir_Click(object sender, EventArgs e)
            {
                try
                {
                    if (MessageBox.Show("Deseja excluir os registros selecionados?", "EXCLUSÃO DE REGISTROS", MessageBoxButtons.YesNo) == DialogResult.Yes)
                    {
                        if (IsSelected())
                        {
                            foreach (DataGridViewRow row in gdvProdutos.Rows)
                            {
                                DataGridViewCheckBoxCell dgvCell = (DataGridViewCheckBoxCell)row.Cells["CheckBox"];
                                if (dgvCell.Value != null && (bool)dgvCell.Value)
                                    gdvProdutos.Rows.Remove(row);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Nenhum registro selecionado para excluir.", "EXCLUSÃO DE REGISTROS");
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Não foi possivel excluir os registros selecionados. Erro: " + ex.Message, "ERRO");
                }
            }
    


    Rotina que verifica se há checkbox selecionada:

    bool IsSelected()
    {
         Boolean b = false;
    
         foreach (DataGridViewRow r in gdvProdutos.Rows)
         {
              DataGridViewCheckBoxCell dgvCell = (DataGridViewCheckBoxCell)r.Cells["CheckBox"];
                        
              if (dgvCell.Value != null && (bool)dgvCell.Value)
                   b = true;
          }
    
          return b;
    }
    


    Como disse, a rotina de exclusão funciona, mas sempre deixa uma linha pra trás e não consigo descobrir porque. Se clico novamente para excluir a linha q ficou pra trás, a linha é excluída normalmente. Esse processo também ocorre quando clico em outro botão para processar os dados selecionados.

    A rotina processa as linhas, mas sempre fica uma para trás. Se clico para processar a linha q restou, ela também é processada normalmente.

    Alguém saberia me dizer o que está ocorrendo  e como corrigir?

    Grato a todos.


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    quarta-feira, 14 de setembro de 2011 22:09

Respostas

Todas as Respostas

  • Boa noite Fabio...

    Verifiquei que tem uma outra Thread sobre o assunto...

    vê se te ajuda....

     

    http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/fdc1a3d9-2a4a-4e7b-a3f2-c286a5089843

     

    Espero ter ajudado....


    Eder dos Santos Silva Analista Programador Pleno Portfólio: http://www.ederssilva.com.br
    quinta-feira, 15 de setembro de 2011 01:46
  • Quando você trabalha com dados no gridview, geralmente ele coloca a linha ou a célula no modo de edição e só atualiza esse valor quando termina a edição. Tenta finalizad o modo de edição no começo do método para ver se funciona.

    gdvProdutos.EndEdit
    



    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    quinta-feira, 15 de setembro de 2011 13:54
  • Obrigado pelas sugestões, Eder e Bruno.

    Verifiquei o link indicado por vc, Eder, mas não é bem isso o q ocorre no meu caso, msm assim, obrigado pela indicação.

    Bruno, farei o que sugeriu e depois posto os resultados. Muito obrigado e forte abraço.


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    sexta-feira, 16 de setembro de 2011 00:08
  • Bruno, utilizei o método gdvProdutos.EndEdit(), mas sem resultados... Ainda permanece o mesmo problema. Exclui as linhas selecionadas, menos uma.

    Porém, se eu seleciono apenas 1 linha, ela é excluida. Mais de uma, sejam 2 ou 10, uma única linha sempre sobra e precisa ser excluida a parte.

    Alguma outra idéia? Grato desde já.


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    sexta-feira, 16 de setembro de 2011 01:07
  • Se você sair e entrar da tela o registro ainda está lá? Se não, tenta dar um refresh no grid no final do método gdvProdutos.Refresh();

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    segunda-feira, 19 de setembro de 2011 15:58
  • Olá, Bruno.

    Então, o registro que deve ser excluido junto com os outros, permanece lá.

    A questão é q o problema só aparece na hora de excluir ou processar mais de uma linha selecionada na grid através do CheckBoxColumn

    Se for excluir/processar um registro por vez, o processo ocorre normalmente...

    Vou tentar utilizar o gdvProdutos.Refresh() e ver o q acontece depois posto o resultado aqui.

    Obrigado mais uma vez.

     


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    segunda-feira, 19 de setembro de 2011 16:57
  • Bruno, fiz o q vc sugeriu e acrescenteu o comando gdvProdutos.Refresh() no final da rotina IsSelected e tb no final da rotina do botão de exclusão.

    O problema persiste... Ao tentar excluir mais de uma linha selecionada, uma linha sempre fica para trás... Mais alguma idéia?

    Grato.


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    segunda-feira, 19 de setembro de 2011 17:54
  • Não tem nenhum outro evento em que você esteja fazendo algo com esse grid? O código relacionado ao grid é só esse? Se quise, sobe o fonte para um site o posta o link que dou uma olhada.

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    quarta-feira, 21 de setembro de 2011 03:46
  • Olá, bruno.

    Sim, há um evento no qual eu faço o commit imediato da celula. Segue o código:

     

    private void gdvProdutos_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
         gdvProdutos.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }
    

     


    Fonte está em www. graficaeradigital.com.br/files/source.rar.

    Grato pela ajuda.


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    • Editado Fabio Crash quarta-feira, 21 de setembro de 2011 17:37
    quarta-feira, 21 de setembro de 2011 17:27
  • Comenta essa linha do evento e tenta capturar os items selecionados dessa forma no seu botão de excluir:

    for (int i = dataGridView1.Rows.Count -1; i >= 0 ; i--)
    {
        if ((bool)dataGridView1.Rows[i].Cells[0].FormattedValue)
        {
            //Suas Operações
        }
    }
    
    

    Se ainda não der, tenta fazer como no link abaixo:

    http://www.mindstick.com/Articles/77b73daa-2307-4de6-91df-7d6fe1094731/?Checkbox%20in%20DataGridView

     


    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Marcado como Resposta Fabio Crash quinta-feira, 22 de setembro de 2011 23:58
    quinta-feira, 22 de setembro de 2011 14:20
  • Problema resolvido, Bruno!

    O problema estava mesmo na hora de processar as linhas da Grid.

    Com o foreach ou mesmo o for (incrementando a variável) o mesmo erro ocorria, mas faendo um loop for do jeito que você sugeriu as linhas são processadas corretamente.

    Agora eu só gostaria de saber o porque disso acontecer.

     

    Muito obrigado pela ajuda! Forte abraço!!!


    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    sexta-feira, 23 de setembro de 2011 00:10
  • O que acontece é que ele ainda não tinha commitado a sua última alteração no checkbox. Com a propriedade FormattedValue você pega o valor mesmo sem ter commitado.

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    • Marcado como Resposta Fabio Crash sexta-feira, 23 de setembro de 2011 00:34
    sexta-feira, 23 de setembro de 2011 00:28
  • O que acontece é que ele ainda não tinha commitado a sua última alteração no checkbox. Com a propriedade FormattedValue você pega o valor mesmo sem ter commitado.

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro


    Entendi... mas mesmo utilizando este método abaixo para forçar o commit? Não deveria ter funcionado então? Peguei esse código no HELP do VS2008.

    private void gdvProdutos_CurrentCellDirtyStateChanged(object sender, EventArgs e)
    {
         gdvProdutos.CommitEdit(DataGridViewDataErrorContexts.Commit);
    }

    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    sexta-feira, 23 de setembro de 2011 00:35
  • Mas você debugou e viu se ele estava passando nesse evento?

    Bruno Ferreira de Souza
    MSP - Microsoft Student Partner
    MCTS .NET Framework - Windows Applications
    MCPD .NET Framework - Windows Applications
    MCC - Microsoft Community Contributor
    www.maestrodotnet.com.br
    @BrunoMaestro

    sexta-feira, 23 de setembro de 2011 00:50
  • Estava passando sim, estranho... Msm assim, valeu pela ajuda!
    Fábio Luiz Biano Worksoftware - Sistemas e Internet www.worksoftware.com.br
    sexta-feira, 23 de setembro de 2011 15:10