Эта строка уже относится к другой ошибке таблицы при попытке добавить строки? - PullRequest
182 голосов
/ 06 апреля 2009

У меня есть 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 ]

315 голосов
/ 06 апреля 2009

Сначала необходимо создать новый 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);
26 голосов
/ 27 февраля 2012

Попробуйте это:

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

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

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.ImportRow(dr);
}
8 голосов
/ 20 апреля 2012
yourTable.ImportRow(dataRow);

Это потому, что копируемая строка не совпадает TableName:

Например, попробуйте:

Table1.TableName = "Table1";
Table2.TableName = "Table2";
3 голосов
/ 13 июня 2016

Это не самое чистое / быстрое / простое / самое элегантное решение, но это грубая сила, которую я создал, чтобы выполнить работу в похожем сценарии:

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» и «Имя» в качестве примеров.

2 голосов
/ 29 июня 2013
foreach (DataRow dr in dtSpecificOrders.rows)
{
   dtSpecificOrders.Rows.Add(dr.ItemArray); 
}
1 голос
/ 21 октября 2013

Почему бы вам просто не использовать CopyToDataTable

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

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();
0 голосов
/ 28 августа 2017

Вы можете присвоить столбцам некоторый идентификатор и дать ему уникальное имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...