可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I have a DataTable which has some rows and I am using the select to filter the rows to get a collection of DataRows which I then loop through using foreach and add it to another DataTable, but it is giving me the error "This Row already belongs to another table". Here is the code:
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:
You need to create a new Row
with the values from dr
first. A DataRow
can only belong to a single DataTable
.
You can also use Add
which takes an array of values:
myTable.Rows.Add(dr.ItemArray)
Or probably even better:
// 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:
Try this:
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);
It's because the row you're copying doesn't have the same TableName
:
For example, try:
Table1.TableName = "Table1"; Table2.TableName = "Table2";
回答4:
This isn't the cleanest/quickest/easiest/most elegant solution, but it is a brute force one that I created to get the job done in a similar scenario:
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(); //
The names in the DataColumns must match those in your original table for it to work. I just used "ID" and "Name" as examples.
回答5:
foreach (DataRow dr in dtSpecificOrders.rows) { dtSpecificOrders.Rows.Add(dr.ItemArray); }
回答6:
Why don't you just use CopyToDataTable
DataTable dt = (DataTable)Session["dtAllOrders"]; DataTable dtSpecificOrders = new DataTable(); DataTable orderRows = dt.Select("CustomerID = 2").CopyToDataTable();
回答7:
you can give some id to the columns and name it uniquely.