none
Foreach em um datatable RRS feed

  • Pergunta

  • Boa noite,

    O que estou fazendo de errado ao tentar percorrer um datable verificar se a coluna 3 é o mesmo do textbox e depois verificar na coluna 10 o valor e caso seja uma dos três inserir na variavel.

    Preciso contar no datable quantos Gaf,Restrição e Preditiva tem para um determinado ativo.

    Desde de ja Obrigado pela atenção.

           foreach (DataRow row in DtRetidos.Rows)
                    {
                        foreach (DataRow dtCol in DtRetidos.Columns)
                        {
                            {
                                if ((string)row[3].ToString() == Txt_Ativo_Selecionado.Text)
                                {
                                    if ((string)row[10].ToString() == "GAF")
                                    {
                                        ContGAF++;
                                    }
                                    if ((string)row[10].ToString() == "RESTRIÇÃO")
                                    {
                                        ContRestricao++;
                                    }
                                    if ((string)row[10].ToString() == "PREDITIVA")
                                    {
                                        ContPreditiva++;
                                    }
                                }
                            }
                        }
                    }

    terça-feira, 9 de fevereiro de 2016 22:22

Respostas

  • Além do DBNull (você tem que verificar se o valor da coluna é igual a essa classe), eu não entendi para que você fez esse segundo loop "foreach (DataRow dtCol in DtRetidos.Columns)". Você poderia resolver só assim:

    foreach (DataRow row in DtRetidos.Rows)
    {
        {
            if (row[2] != System.DBNull.Value && (string)row[3] == Txt_Ativo_Selecionado.Text)
            {
                if (row[9] != System.DBNull.Value)
                {
                    switch ((string)row[9])
                    {
                        case "GAF": ContGAF++; break;
                        case "RESTRIÇÃO": ContRestricao++; break;
                        case "PREDITIVA": ContPreditiva++; break;
                    }
                }
            }
        }
    }

    Entende? "row[X]" pega o valor na posição "X" da linha, você não precisa fazer um "foreach" das colunas.

    • Sugerido como Resposta SammuelMiranda quarta-feira, 10 de fevereiro de 2016 12:23
    • Marcado como Resposta Marcos SJ quarta-feira, 10 de fevereiro de 2016 12:38
    quarta-feira, 10 de fevereiro de 2016 12:23

Todas as Respostas

  • Índices partem do Zero, então utilize row[2] para a coluna 3 e row[9] para a coluna 10, pois row[0] seria a primeira coluna.
    terça-feira, 9 de fevereiro de 2016 22:59
  • O CAST também está com problema. (string)row[3].ToString() é equivalente a row[3].ToString().

    Nesse caso você pode ter um erro de DBNull ou de null reference exception. Você pode testar desta forma:

    if (!DBNull.Value.Equals(row[0]))
    {
    //Não é nullo
    }

    Você pode converter desta forma também: Convert.ToString(row[0])

    Se não tiver certeza sobre a posição da coluna deve poder fazer algo como isto:
    row["NomeDaColuna"]

    terça-feira, 9 de fevereiro de 2016 23:09
  • Além do DBNull (você tem que verificar se o valor da coluna é igual a essa classe), eu não entendi para que você fez esse segundo loop "foreach (DataRow dtCol in DtRetidos.Columns)". Você poderia resolver só assim:

    foreach (DataRow row in DtRetidos.Rows)
    {
        {
            if (row[2] != System.DBNull.Value && (string)row[3] == Txt_Ativo_Selecionado.Text)
            {
                if (row[9] != System.DBNull.Value)
                {
                    switch ((string)row[9])
                    {
                        case "GAF": ContGAF++; break;
                        case "RESTRIÇÃO": ContRestricao++; break;
                        case "PREDITIVA": ContPreditiva++; break;
                    }
                }
            }
        }
    }

    Entende? "row[X]" pega o valor na posição "X" da linha, você não precisa fazer um "foreach" das colunas.

    • Sugerido como Resposta SammuelMiranda quarta-feira, 10 de fevereiro de 2016 12:23
    • Marcado como Resposta Marcos SJ quarta-feira, 10 de fevereiro de 2016 12:38
    quarta-feira, 10 de fevereiro de 2016 12:23
  • Além do DBNull (você tem que verificar se o valor da coluna é igual a essa classe), eu não entendi para que você fez esse segundo loop "foreach (DataRow dtCol in DtRetidos.Columns)". Você poderia resolver só assim:

    foreach (DataRow row in DtRetidos.Rows)
    {
        {
            if (row[2] != System.DBNull.Value && (string)row[3] == Txt_Ativo_Selecionado.Text)
            {
                if (row[9] != System.DBNull.Value)
                {
                    switch ((string)row[9])
                    {
                        case "GAF": ContGAF++; break;
                        case "RESTRIÇÃO": ContRestricao++; break;
                        case "PREDITIVA": ContPreditiva++; break;
                    }
                }
            }
        }
    }

    Entende? "row[X]" pega o valor na posição "X" da linha, você não precisa fazer um "foreach" das colunas.

    Muito Obrigado Sammuel !
    sexta-feira, 12 de fevereiro de 2016 22:19