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";