none
Duplicidade DataGridView RRS feed

  • Pergunta

  • Boa tarde a todos!

    Alguém pode me ajudar nesse código ai, Problema de ele e seguinte... era para ele fazer uma varredura no grid para verificar se existe dados duplicado, porem ele so consegue ler a primeira linha e avisar que existe dados duplicado. Se existir dados duplicados da segunda linha pra baixo ele não avisa.

     foreach (DataGridViewRow linha in DtgConsultaPaciente.Rows)
                {
    
                    if (linha.Index != DtgConsultaPaciente.CurrentRow.Index)//Verifica se já existe uma primeira linha para fazer a varredura.
                    {
                        if (linha.Cells[1].Value.ToString().Contains(DtgConsultaPaciente.CurrentRow.Cells["ColHoraConsulta"].Value.ToString())) // Se a Celula "1" da linha corrente contem o valor "TEXTOQUENAOPODEREPETIR" a mensagem abaixo é apresentada
                        {
                            MessageBox.Show("Conflito de Horário. Favor Verificar Agenda e Remover Duplicado...", "Validando dados", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                            DtgConsultaPaciente.CurrentRow.Cells[4].Value = "DUBLICADO";                        //Da o valor nulo a celula 1 da linha corrente
                                                                                                                //  ExcluirConsulta();                                                             //TxtHorarioAgenda.Focus();
                            cbNomePaciente.Focus();                                                   // ExibirHorario();
                            return;
                        }
                    }
    
    
    
                    }

    Se alguém puder ajudar agradeço...

    obs: esse código eu peguei aqui no fórum, tentei uma resposta  onde ele foi postado porem não tive retorno.

    att;


    sábado, 2 de março de 2019 15:50

Respostas

  • Entendi ser problema, nesse caso vc precisa de pelo menos mais um laço para que faça a validação de de todas as linhas!
    algo desse tipo:

    public void ValidacaoLinhas()
    {
        List<string> LinhasRepetidas = new List<string>();
        try
        {
            DataGridView dg = new DataGridView();
            dg.Columns.Add("Id", "Id");
            dg.Columns.Add("HoraC", "Hrs. Cons");
            dg.Columns.Add("Paciente", "Paciente");
            dg.Columns.Add("DataC", "Data. Cons");
            dg.Columns.Add("Status", "Status");
            dg.Columns.Add("Excluir", "Excluir");
     
            dg.Rows.Add(1, "07:00", "Queila R. Canali", "02/03/2019", "Faltou");
            dg.Rows.Add(2, "07:30", string.Empty, string.Empty, "Livre");
            dg.Rows.Add(3, "08:00", string.Empty, string.Empty, "Livre");
            dg.Rows.Add(4, "08:30", "Fabricio Canali", "02/03/2019", "Agendado");
            dg.Rows.Add(5, "08:30", "Queila R. Canali", "02/03/2019", "Agendado");
            dg.Rows.Add(6, "09:00", string.Empty, string.Empty, "Livre");
     
            foreach (DataGridViewRow linha in dg.Rows)
            {
                foreach (DataGridViewRow linha2 in dg.Rows)
                {
                    if (linha.Index != linha2.Index)
                        if (linha.Cells[1].Value != null && linha2.Cells[1].Value != null)
                            if (linha.Cells[1].Value.ToString().Trim() == linha2.Cells[1].Value.ToString().Trim())
                                LinhasRepetidas.Add(string.Format("Id Original: {0} - Id Duplicado: {1} - Horario: {2}", linha.Index.ToString(), linha2.Index.ToString(), linha2.Cells[1].Value));
                }
            }
        }
        catch (Exception ex)
        {
            LinhasRepetidas.Add(ex.Message);
        }
    }

    Ao final da execução terá uma lista de strings com as linhas repetidas.

    segunda-feira, 4 de março de 2019 17:54

Todas as Respostas

  • Bom dia, amigo.
    Pelo que vi, o erro esta na comparação da linha abaixo:

    if (linha.Cells[1].Value.ToString().Contains(DtgConsultaPaciente.CurrentRow.Cells["ColHoraConsulta"].Value.ToString())) // Se a Celula "1" da linha corrente contem o valor "TEXTOQUENAOPODEREPETIR" a mensagem abaixo é apresentada

    Pois vc esta comparando Cells[1] que é a Coluna "Paciente" com a coluna ["ConsHoraConsulta"], ja que a posição inicial do DataGridRown é 0 e não 1.

    Tente assim:

    if (linha.Cells[0].Value.ToString().Contains(DtgConsultaPaciente.CurrentRow.Cells["ColHoraConsulta"].Value.ToString()))


    segunda-feira, 4 de março de 2019 15:25
  • Boa Tarde amigo!

    Não deu certo, ele só faz a comparação na primeira linha se a duplicação for da segunda pra baixo ele não avisa que tem dados duplicados. tem um outra sugestão...

    att;

    segunda-feira, 4 de março de 2019 16:58
  • Entendi ser problema, nesse caso vc precisa de pelo menos mais um laço para que faça a validação de de todas as linhas!
    algo desse tipo:

    public void ValidacaoLinhas()
    {
        List<string> LinhasRepetidas = new List<string>();
        try
        {
            DataGridView dg = new DataGridView();
            dg.Columns.Add("Id", "Id");
            dg.Columns.Add("HoraC", "Hrs. Cons");
            dg.Columns.Add("Paciente", "Paciente");
            dg.Columns.Add("DataC", "Data. Cons");
            dg.Columns.Add("Status", "Status");
            dg.Columns.Add("Excluir", "Excluir");
     
            dg.Rows.Add(1, "07:00", "Queila R. Canali", "02/03/2019", "Faltou");
            dg.Rows.Add(2, "07:30", string.Empty, string.Empty, "Livre");
            dg.Rows.Add(3, "08:00", string.Empty, string.Empty, "Livre");
            dg.Rows.Add(4, "08:30", "Fabricio Canali", "02/03/2019", "Agendado");
            dg.Rows.Add(5, "08:30", "Queila R. Canali", "02/03/2019", "Agendado");
            dg.Rows.Add(6, "09:00", string.Empty, string.Empty, "Livre");
     
            foreach (DataGridViewRow linha in dg.Rows)
            {
                foreach (DataGridViewRow linha2 in dg.Rows)
                {
                    if (linha.Index != linha2.Index)
                        if (linha.Cells[1].Value != null && linha2.Cells[1].Value != null)
                            if (linha.Cells[1].Value.ToString().Trim() == linha2.Cells[1].Value.ToString().Trim())
                                LinhasRepetidas.Add(string.Format("Id Original: {0} - Id Duplicado: {1} - Horario: {2}", linha.Index.ToString(), linha2.Index.ToString(), linha2.Cells[1].Value));
                }
            }
        }
        catch (Exception ex)
        {
            LinhasRepetidas.Add(ex.Message);
        }
    }

    Ao final da execução terá uma lista de strings com as linhas repetidas.

    segunda-feira, 4 de março de 2019 17:54
  • Boa Tarde Amigo!

    Justamente quando iria lhe responder você postou a resposta, seu código.

    bom consegui resolver aqui dessa forma, não sei se e a mais correta mais funcionou. Segue código que usei.

    private void ArqDuplicado()
            {            
                bool Duplicidade = false;
    
                //verifica duplicidade a partir do segundo item da grid.
                if (DtgConsultaPaciente.Rows.Count > 0)
                {
                    for (var i = 0; i < DtgConsultaPaciente.Rows.Count; i++)
                    {   //posiciona na coluna 0 da grid e na linha corrente
                        DtgConsultaPaciente.CurrentCell = DtgConsultaPaciente[1, i];
                        //verifica se o código informado é o mesmo da grid
                        foreach (DataGridViewRow linha in DtgConsultaPaciente.Rows)
                            if (linha.Index != DtgConsultaPaciente.CurrentRow.Index)//Verifica se já existe uma primeira linha para fazer a varredura.
                        {
                            if (linha.Cells[1].Value.ToString().Contains(DtgConsultaPaciente.CurrentRow.Cells["ColHoraConsulta"].Value.ToString())) // Se a Celula "1" da linha corrente contem o valor "TEXTOQUENAOPODEREPETIR" a mensagem abaixo é apresentada
                            {
                                    MessageBox.Show("Conflito de Horário. Favor Verificar Agenda e Remover Duplicado...", "Validando dados", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                                    DtgConsultaPaciente.CurrentRow.Cells[4].Value = "DUBLICADO";
                                    
                                    Duplicidade = true;
                                    //posiciona na coluna 1 da grid que tem a Horários
                                    DtgConsultaPaciente.CurrentCell = DtgConsultaPaciente[1, i];
                                    break;
    
                                }
                        }
                        
                    }
                }
                if (Duplicidade == true)
                {
                    
        
                }
                else
                {
                   
                }
                //DtgConsultaPaciente.DataSource = null;
                DtgConsultaPaciente.Update();
                DtgConsultaPaciente.Refresh();
            }    

    Mesmo Assim Vou testar seu código aqui, muito obrigado pela ajuda...

    att;

    segunda-feira, 4 de março de 2019 18:30