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