¿Esta fila ya pertenece a otro error de tabla al intentar agregar filas?


197

Tengo una DataTable que tiene algunas filas y estoy usando el select para filtrar las filas para obtener una colección de DataRows que luego recorro usando foreach y lo agrego a otra DataTable, pero me está dando el error "Esta fila ya pertenece a otra mesa ". Aquí está el código:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.Rows.Add(dr); //Error thrown here.
}

1
gran pregunta Me confundo acerca de las filas y las tablas que pertenecen a otros contenedores
Vivian River

Respuestas:


339

Necesita crear una nueva Rowcon los valores de drprimero. A DataRowsolo puede pertenecer a un solo DataTable.

También puede usar el Addque toma una matriz de valores:

myTable.Rows.Add(dr.ItemArray)

O probablemente incluso mejor:

// This works because the row was added to the original table.
myTable.ImportRow(dr);

// The following won't work. No data will be added or exception thrown.
var drFail = dt.NewRow()
drFail["CustomerID"] = "[Your data here]";
// dt.Rows.Add(row); // Uncomment for import to succeed.
myTable.ImportRow(drFail);

66
¿Puedo usar ImportRow como alernative? y ¿Por qué .NET solo no le permitiría tener el mismo DataRow para diferentes DataTables? ¿Es esto por diseño?
Xaisoft el

3
Heh, me acabo de dar cuenta de ImportRow, edito mi respuesta y todos me ganaron. Pero sí me gustaría recomendar este enfoque, ya que copiará la fila para usted
JoshBerke

2
ImportRowNo trabajas para mí. ¡Pero Add Rows lo hizo! Thanksssssssssss
nawfal

1
ImportRow no funcionará si la fila que importa es una referencia a la fila en la tabla de origen. ItemArray funciona si usa la fila de origen, pero debe recordar agregar la fila al destino antes de eliminar la fila del origen; de lo contrario, se queja de que la fila se ha eliminado y no puede encontrar los datos.
Adam Houldsworth

2
.ImportRow()no funcionó para mí porque no hice .Clone()o creé columnas en mi nueva DataTable, inicialmente. Se me ocurrió 0 cuando miré en .Rows.Countmi nueva mesa. Como iba a necesitar crear columnas en mi tabla y agregarlas, simplemente creé una NewRow()declaración y agregué mis valores a las columnas en esa nueva fila directamente y agregué esa fila a mi tabla, dentro del ciclo (vea mi respuesta a continuación) .
vapcguy

34

Prueba esto:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = dt.Clone();

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.ImportRow(dr);
}

3
Gracias por esto ... aunque la respuesta proporcionada por @JoshBerke fue correcta, debe clonar la tabla original como en su ejemplo para que funcione.
carny666

8
yourTable.ImportRow(dataRow);

Es porque la fila que está copiando no tiene la misma TableName:

Por ejemplo, intente:

Table1.TableName = "Table1";
Table2.TableName = "Table2";

1
Yo también tenía una mesa mal llamada. ¡Gracias!
Bruno

3
foreach (DataRow dr in dtSpecificOrders.rows)
{
   dtSpecificOrders.Rows.Add(dr.ItemArray); 
}

1
No creo que pueda agregar nada a lo que está iterando, ya que lo está haciendo.
vapcguy

3

Esta no es la solución más limpia / rápida / fácil / elegante, pero es una fuerza bruta que creé para hacer el trabajo en un escenario similar:

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

// Create new DataColumns for dtSpecificOrders that are the same as in "dt"
DataColumn dcID = new DataColumn("ID", typeof(int));
DataColumn dcName = new DataColumn("Name", typeof(string));
dtSpecificOrders.Columns.Add(dtID);
dtSpecificOrders.Columns.Add(dcName);

DataRow[] orderRows = dt.Select("CustomerID = 2");

foreach (DataRow dr in orderRows)
{
    DataRow myRow = dtSpecificOrders.NewRow();  // <-- create a brand-new row
    myRow[dcID] = int.Parse(dr["ID"]);
    myRow[dcName] = dr["Name"].ToString();
    dtSpecificOrders.Rows.Add(myRow);   // <-- this will add the new row
}

Los nombres en las columnas de datos deben coincidir con los de su tabla original para que funcione. Acabo de usar "ID" y "Nombre" como ejemplos.


1

¿Por qué no solo usas CopyToDataTable

DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();

1
¿Qué se supone que orderRows debe estar aquí?
Avi

Una nueva DataTable de las filas seleccionadas de dt, Avi.
vapcguy

0

puede dar alguna identificación a las columnas y nombrarla de forma exclusiva.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.