Hàng này đã thuộc về một lỗi bảng khác khi cố gắng thêm hàng?


197

Tôi có một DataTable có một số hàng và tôi đang sử dụng select để lọc các hàng để lấy một tập hợp DataRows mà sau đó tôi lặp lại bằng cách sử dụng foreach và thêm nó vào một DataTable khác, nhưng nó gây ra lỗi cho tôi "Hàng này đã thuộc về sang bàn khác ". Đây là mã:

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
câu hỏi tuyệt vời; Tôi bị lẫn lộn về các hàng và bảng thuộc về các container khác
Sông Vivian

Câu trả lời:


339

Bạn cần tạo một cái mới Rowvới các giá trị từ drđầu tiên. A DataRowchỉ có thể thuộc về một DataTable.

Bạn cũng có thể sử dụng Addmột mảng các giá trị:

myTable.Rows.Add(dr.ItemArray)

Hoặc có thể thậm chí tốt hơn:

// 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);

6
Tôi có thể sử dụng ImportRow như một thuật ngữ không? và Tại sao .NET chỉ không cho phép bạn có cùng DataRow cho các DataTables khác nhau? Đây có phải là do thiết kế?
Xaisoft

3
Heh tôi mới nhận ra ImportRow, chỉnh sửa câu trả lời của tôi và tất cả các bạn đã đánh bại tôi với nó. Nhưng bạn nên giới thiệu cách tiếp cận này vì nó sẽ sao chép hàng cho bạn
JoshBerke

2
ImportRowdin làm việc cho tôi Nhưng Add Rows đã làm! Thanksssssssssss
nawfal

1
ImportRow sẽ không hoạt động nếu hàng bạn nhập là tham chiếu đến hàng trong bảng nguồn. ItemArray hoạt động nếu bạn sử dụng hàng nguồn, nhưng bạn phải nhớ thêm hàng vào đích trước khi bạn xóa hàng khỏi nguồn, nếu không, nó phàn nàn hàng đã bị xóa và không thể tìm thấy dữ liệu.
Adam Houldsworth

2
.ImportRow().Clone()ban đầu tôi không làm việc vì tôi không làm hoặc tạo các cột trên DataTable mới. Nó xuất hiện với 0 khi tôi nhìn .Rows.Countvào bàn mới của mình. Vì tôi sẽ cần tạo các cột trên bảng của mình và thêm chúng, tôi chỉ cần tạo một NewRow()câu lệnh và thêm các giá trị của mình vào các cột trên hàng mới đó và thêm hàng đó vào bảng của tôi, trong vòng lặp (xem câu trả lời của tôi bên dưới) .
vapcguy

34

Thử cái này:

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

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

foreach (DataRow dr in orderRows)
{
    dtSpecificOrders.ImportRow(dr);
}

3
Cảm ơn bạn vì điều này .. mặc dù câu trả lời được cung cấp bởi @JoshBerke là chính xác, bạn cần sao chép bảng gốc như trong ví dụ của bạn để nó hoạt động.
carny666

8
yourTable.ImportRow(dataRow);

Đó là vì hàng bạn đang sao chép không giống nhau TableName:

Ví dụ: thử:

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

1
Tôi đã có một bảng sai tên quá. Cảm ơn!
Bruno

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

1
Tôi không nghĩ bạn có thể thêm bất cứ điều gì vào những gì bạn đang lặp đi lặp lại, vì bạn đang lặp đi lặp lại qua nó.
vapcguy

3

Đây không phải là giải pháp sạch nhất / nhanh nhất / dễ nhất / thanh lịch nhất, nhưng nó là một giải pháp mạnh mẽ mà tôi đã tạo ra để hoàn thành công việc trong một kịch bản tương tự:

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
}

Tên trong DataColumn phải khớp với tên trong bảng gốc của bạn để nó hoạt động. Tôi chỉ sử dụng "ID" và "Tên" làm ví dụ.


1

Tại sao bạn không sử dụng CopyToDataTable

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

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

1
OrderRows được cho là ở đây là gì?
Avi

Một DataTable mới của các hàng được chọn từ dt, Avi.
vapcguy

0

bạn có thể cung cấp một số id cho các cột và đặt tên duy nhất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.