แถวนี้เป็นของข้อผิดพลาดของตารางอื่นเมื่อพยายามเพิ่มแถวหรือไม่


197

ฉันมี DataTable ซึ่งมีบางแถวและฉันใช้ตัวเลือกเพื่อกรองแถวเพื่อรับชุด 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.
}

1
คำถามที่ดี; ฉันสับสนเกี่ยวกับแถวและตารางที่เป็นของภาชนะอื่น ๆ
แม่น้ำวิเวียน

คำตอบ:


339

คุณต้องสร้างใหม่Rowด้วยค่าตั้งแต่drแรก A 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);

6
ฉันสามารถใช้ ImportRow เป็น alernative ได้หรือไม่ และทำไม. NET จะไม่อนุญาตให้คุณมี DataRow เดียวกันสำหรับ DataTables ต่างกัน นี่เป็นการออกแบบหรือเปล่า?
Xaisoft

3
ฉันเพิ่งตระหนักถึง ImportRow แก้ไขคำตอบของฉันและคุณก็เอาชนะฉันได้ แต่แท้จริงแล้วผมอยากแนะนำวิธีการที่มันจะคัดลอกแถวสำหรับคุณ
JoshBerke

2
ImportRowทำงานให้ฉัน แต่เพิ่มแถวทำ! Thanksssssssssss
nawfal

1
ImportRow จะไม่ทำงานหากแถวที่คุณนำเข้าเป็นการอ้างอิงแถวในตารางต้นฉบับ ItemArray ใช้งานได้หากคุณใช้แถวต้นทาง แต่คุณต้องจำไว้ว่าต้องเพิ่มแถวไปยังปลายทางก่อนที่คุณจะลบแถวออกจากแหล่งข้อมูลมิฉะนั้นแถวนั้นจะบ่นว่าแถวนั้นถูกลบและไม่สามารถหาข้อมูลได้
Adam Houldsworth

2
.ImportRow()ไม่ทำงานสำหรับฉันเพราะฉันไม่ได้ทำ.Clone()หรือสร้างคอลัมน์ใน DataTable ใหม่ของฉันในขั้นต้น มันเกิดขึ้นกับ 0 เมื่อฉันดู.Rows.Countบนโต๊ะใหม่ของฉัน เนื่องจากฉันจะต้องสร้างคอลัมน์ในตารางของฉันและเพิ่มพวกเขาฉันเพิ่งสร้างNewRow()คำสั่งและเพิ่มค่าของฉันไปยังคอลัมน์ในแถวใหม่นั้นโดยตรงและเพิ่มแถวนั้นลงในตารางของฉันภายในลูป (ดูคำตอบของฉันด้านล่าง) .
vapcguy

34

ลองสิ่งนี้:

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

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

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

3
ขอบคุณสำหรับสิ่งนี้ .. ถึงแม้ว่าคำตอบของ @JoshBerke นั้นถูกต้องคุณจะต้องทำการโคลนตารางต้นฉบับตามตัวอย่างเพื่อให้มันใช้งานได้
carny666

8
yourTable.ImportRow(dataRow);

เป็นเพราะแถวที่คุณคัดลอกไม่มีเหมือนTableNameกัน:

ตัวอย่างเช่นลอง:

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

1
ฉันมีตารางที่ผิด ขอบคุณ!
Bruno

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

1
ฉันไม่คิดว่าคุณสามารถเพิ่มอะไรลงไปในสิ่งที่คุณกำลังทำซ้ำได้ในขณะที่คุณกำลังทำซ้ำ
vapcguy

3

นี่ไม่ใช่วิธีการแก้ปัญหาที่สะอาด / เร็วที่สุด / ง่ายที่สุด / สุดหรู แต่เป็นแรงเดรัจฉานที่ฉันสร้างขึ้นเพื่อให้งานสำเร็จในสถานการณ์ที่คล้ายกัน:

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" และ "ชื่อ" เป็นตัวอย่าง


1

ทำไมคุณไม่ใช้ CopyToDataTable

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

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

1
ลำดับที่ควรจะอยู่ที่นี่คืออะไร?
Avi

DataTable ใหม่ของแถวที่เลือกจากdtAvi
vapcguy

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.