C# 尝试添加行时,此行已属于另一个表错误?

C# 尝试添加行时,此行已属于另一个表错误?,c#,C#,我有一个DataTable,其中有一些行,我正在使用select筛选这些行,以获得一个DataRows集合,然后我使用foreach循环该集合并将其添加到另一个DataTable,但它给了我一个错误“这一行已经属于另一个表”。代码如下: DataTable dt = (DataTable)Session["dtAllOrders"]; DataTable dtSpecificOrders = new DataTable(); DataRow[] orderRows = dt.Select("C

我有一个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.
}

您需要首先使用
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);
}
这是因为您要复制的行没有相同的
TableName

例如,尝试:

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

为什么不直接使用
CopyToDataTable

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

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();

这不是最干净/最快/最简单/最优雅的解决方案,但它是我为在类似场景中完成工作而创建的一个蛮力解决方案:

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
}
DataTable dt=(DataTable)会话[“dtAllOrders”];
DataTable dtSpecificOrders=新DataTable();
//为dtSpecificOrders创建与“dt”中相同的新数据列
DataColumn dcID=新的DataColumn(“ID”,typeof(int));
DataColumn dcName=新的DataColumn(“名称”,类型(字符串));
dtSpecificOrders.Columns.Add(dtID);
dtSpecificOrders.Columns.Add(dcName);
DataRow[]orderRows=dt.Select(“CustomerID=2”);
foreach(orderRows中的数据行dr)
{

DataRow myRow=dtSpecificOrders.NewRow();//您可以为列指定一些id,并对其进行唯一命名。

我可以使用ImportRow作为一种替代方法吗?为什么.NET不允许您为不同的数据表使用相同的数据行?这是出于设计吗?嘿,我刚刚意识到ImportRow,编辑我的答案,你们都比我快。但是,我建议使用这种方法,因为它会复制行对于您,
ImportRow
din对我有效。但是添加行确实有效!如果您导入的行是对源表中的行的引用,则ThanksSimportRow将不起作用。如果您使用源行,ItemArray会起作用,但您必须记住在从源中删除行之前将行添加到目标,否则它会投诉row已被删除,无法找到数据。
.ImportRow()
不适用于我,因为我没有执行
.Clone()
或最初在我的新数据表上创建列。当我查看新表上的
.Rows.Count
时,它显示为0。因为我需要在我的表上创建列并添加它们,所以我只创建了一个
新行()
语句,并将我的值直接添加到该新行的列中,并将该行添加到循环中的我的表中(请参见下面我的答案)。好问题;我对属于其他容器的行和表感到困惑。我也有一个命名错误的表。谢谢!谢谢。虽然@JoshBerke提供的答案是正确的,但您需要克隆原始表,如示例中所示。orderRows应该在这里是什么?从 dt
,Avi.我认为你不能在你正在迭代的东西上添加任何东西,因为你正在迭代它。
DataTable dt = (DataTable)Session["dtAllOrders"];
DataTable dtSpecificOrders = new DataTable();

DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();
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
}