Usuário com melhor resposta
Foreach em um datatable

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++; } } } } }
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
Todas as Respostas
-
-
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"] -
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
-
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.