2008-11-24 25 views
7

He llenado una tabla de datos, desde 2 servidores diferentes. Puedo hacer ajustes donde mi longitud> 0, lo que quiero hacer es eliminar las filas que no golpean. Aquí hay un resumen de lo que tengoLooping a través de una tabla de datos y eliminar la fila

DataRow[] dr = payments.dtPayments.Select(myselect); 

if (dr.Length > 0) 
{ 
    for (int a = 0; a < dr.Length; a++) 
    { 
     if (thisOption == true) 
     dr[0].Delete(); 
     else if (otherOption == true) 
     { 
     dr[0]["Date"] = myDataReader["date"].ToString().Trim(); 
     dr[0]["Pay"] = payTypeName(myDataReader["ccdsrc"].ToString() 
                  .Trim()); 
     } 
    } 
} 
if (dr.Length == 0) 
{       
    if (LastOption == true) 
    { 
    //DataRow should be removed 
    }       
} 

Respuesta

4

Si dr.Length es cero, su selección no devolvió ninguna fila. Si desea eliminar filas que no coinciden con sus criterios, lo implementaría como un tipo diferente de consulta. También podría ser que estoy malinterpretando completamente tu pregunta. ¿Podría actualizar su pregunta para mostrar su SQL e indicar en qué parte del código de muestra tiene el problema: dentro del ciclo o después del ciclo donde tiene su comentario?

+0

tienes razón. Me doy cuenta de que no estoy devolviendo ninguna fila. Lo que hice fue crear un nuevo conjunto de datos y completar las filas con lo que encontré. Gracias –

1

¿Has probado esto?

payments.dtPayments.Rows.Remove (dr)

+0

Lo hice, y lo busqué más. Primero tuve dr [0] .delete, tuve lo que sugeriste (dr y dr [0]) y el índice de error estuvo fuera de los límites de la matriz es mi error. ¿Hay alguna manera de corregir eso? –

18

No estoy seguro de entender completamente su pregunta, pero parece que intenta quitar una entrada de la recolección, mientras que todavía se recorre sobre ella. (Los que ocurre un error de índice de matriz)

debe guardar una referencia a cada entrada que desea eliminar en una nueva colección y luego eliminar todas las nuevas entradas de la antigua colección:

DataRow[] dr = payments.dtPayments.Select(myselect); 
List<DataRow> rowsToRemove = new List<DataRow>(); 

for (int a = 0; a < dr.Length; a++) { 
    if(/* You want to delete this row */) { 
     rowsToRemove.Add(dr[a]); 
    } 
} 

foreach(var dr in rowsToRemove) { 
    payments.dtPayments.Rows.Remove(dr); 
} 
+0

¡Eres genial! –

2

Es necesario para crear un datarow fuera del ciclo, luego, cuando llegue a la fila que desea eliminar, asígnelo a la fila que creó afuera. y romper el ciclo Luego, debajo del lazo, puedes quitarlo.

DataRow r = null; 
foreach(DataRow row in table.Rows) 
{ 
    if(condition==true) 
    { 
     r = row; 
     break; 
    } 
} 

table.Rows.Remove(r); 
1

Puede recorrer la colección en reversa (para (int i = rows.length-1; x> -1; x--)) para eliminar varias filas para asegurarse de que no obtendrá índices de errores encuadernados .

+0

Me gusta mucho mejor que el bucle doble. Este es siempre mi método preferido. – Richard

Cuestiones relacionadas