Эта строка уже принадлежит другой таблице ошибка при попытке добавить строки?
У меня есть DataTable, который имеет несколько строк, и я использую select для фильтрации строк, чтобы получить коллекцию DataRows, которую я затем перебираю с помощью foreach и добавляю ее в другую DataTable, но это дает мне ошибку "эта строка уже принадлежит другой таблице". Вот код:
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.
}
7 ответов:
вам нужно создать новый
Rowсо значениями отdrпервый. АDataRowможет принадлежать только одномуDataTable.вы также можете использовать
Addкоторый принимает массив значений:myTable.Rows.Add(dr.ItemArray)или, возможно, даже лучше:
// 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);
попробуйте это:
DataTable dt = (DataTable)Session["dtAllOrders"]; DataTable dtSpecificOrders = dt.Clone(); DataRow[] orderRows = dt.Select("CustomerID = 2"); foreach (DataRow dr in orderRows) { dtSpecificOrders.ImportRow(dr); }
yourTable.ImportRow(dataRow);это потому, что строка, которую вы копируете, не имеет того же
TableName:например, попробовать:
Table1.TableName = "Table1"; Table2.TableName = "Table2";
Это не самое чистое/быстрое/простое / самое элегантное решение, но это грубая сила, которую я создал, чтобы выполнить работу в аналогичном сценарии:
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 }имена в DataColumns должны совпадать с именами в исходной таблице для его работы. Я просто использовал "ID" и "Name" в качестве примеров.
почему бы вам просто не использовать
CopyToDataTableDataTable dt = (DataTable)Session["dtAllOrders"]; DataTable dtSpecificOrders = new DataTable(); DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();
Comments