我有一个数据表,其中有一些行,我使用选择来过滤行,以获得一个DataRows的集合,然后我循环使用foreach,并将其添加到另一个数据表,但它给我的错误“这一行已经属于另一个表”。代码如下:

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 first中的值创建一个新Row。一个数据线只能属于一个数据表。

你也可以使用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";

foreach (DataRow dr in dtSpecificOrders.rows)
{
   dtSpecificOrders.Rows.Add(dr.ItemArray); 
}

为什么不用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
}

DataColumns中的名称必须与原始表中的名称匹配才能正常工作。我只是用“ID”和“Name”作为例子。


您可以为列指定某个id,并唯一地命名它。


尝试使用copy方法复制数据表 dt1 = dt.Copy();

然后使用Clear方法删除dt1中的所有行 dt1.Rows.Clear ();

然后重新开始导入

foreach (DataRow myRow in dt.Rows)
{
   dt1.ImportRow(myRow);
}

在遇到这种错误时,尤其是在绑定场景中,应该非常小心。这很可能表明您可能绑定到错误的数据表。