c#

c# - Esta fila ya pertenece a otro error de tabla al intentar agregar filas?



(7)

Tengo una DataTable que tiene algunas filas y estoy usando la opción para filtrar las filas para obtener una colección de DataRows que luego recorro usando foreach y lo agrego a otra DataTable, pero me da 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. }


¿Por qué no utilizas CopyToDataTable

DataTable dt = (DataTable)Session["dtAllOrders"]; DataTable dtSpecificOrders = new DataTable(); DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();


Esta no es la solución más limpia / más rápida / más fácil / más elegante, pero es una fuerza bruta que he creado 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 la tabla original para que funcione. Acabo de usar "ID" y "Nombre" como ejemplos.


Primero debe crear una Row con los valores de dr . Un DataRow solo puede pertenecer a una única DataTable .

También puede usar Add que toma una matriz de valores:

myTable.Rows.Add(dr.ItemArray)

O probablemente aún 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);


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); }


puede dar una identificación a las columnas y nombrarla de manera única.


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


yourTable.ImportRow(dataRow);

Es porque la fila que está copiando no tiene el mismo nombre de TableName :

Por ejemplo, intente:

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