2009-04-06 31 views
157

Tôi có một DataTable có một số hàng và tôi đang sử dụng lựa chọn để lọc các hàng để lấy một tập hợp DataRows mà sau đó tôi lặp qua sử dụng foreach và thêm nó vào một DataTable khác, nhưng nó cho tôi lỗi "This Row đã thuộc về một bảng khác ". Đây là mã:Hàng này đã thuộc về một lỗi bảng khác khi cố gắng thêm hàng?

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 hay; Tôi bị lẫn lộn về các hàng và bảng thuộc về các vật chứa khác –

Trả lời

279

Bạn cần tạo mới với các giá trị từ dr trước tiên. Một DataRow chỉ có thể thuộc về một đơn DataTable.

Bạn cũng có thể sử dụng Add mà phải mất một mảng các giá trị:

myTable.Rows.Add(dr.ItemArray) 

Hoặc có lẽ 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); 
+5

Tôi có thể sử dụng ImportRow như một bộ phận giả mạo không? và tại sao .NET lại 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ế không? – Xaisoft

+0

Cảm ơn đoạn mã trên. Tôi sắp hỏi nếu tôi có 100 hàng, tôi có phải gõ tất cả chúng ra không? – Xaisoft

+3

Heh Tôi vừa 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 đều đánh tôi với nó. Nhưng tôi sẽ khuyên bạn nên tiếp cận như nó sẽ sao chép hàng cho bạn – JoshBerke

20

Hãy thử điều 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

7
yourTable.ImportRow(dataRow); 

Đó là bởi vì hàng bạn đang sao chép không có cùng TableName:

Ví dụ, hãy thử:

Table1.TableName = "Table1"; 
Table2.TableName = "Table2"; 
+1

Tôi cũng có bảng bị đặt tên sai. Cảm ơn! – Bruno

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

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

1

Tại sao bạn không chỉ cần sử dụng CopyToDataTable

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

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

Lệnh orderRows phải ở đây là gì? – Avi

+0

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

3

Đây không phải là sạch nhất/nhanh nhất/giải pháp đơn giản nhất/thanh lịch nhất, nhưng đó là giải pháp bạo lực mà tôi đã tạo để hoàn thành công việc trong một trường hợp 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 để bảng hoạt động. Tôi chỉ sử dụng "ID" và "Tên" làm ví dụ.

0

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

Các vấn đề liên quan