ฉันเห็นคำตอบที่ถูกต้องอยู่หลายส่วน แต่ขอฉันรวบรวมทั้งหมดและอธิบายสองสิ่งนี้
ก่อนอื่นAcceptChanges
ควรใช้เพื่อทำเครื่องหมายธุรกรรมทั้งหมดบนตารางว่าได้รับการตรวจสอบและยืนยันแล้วเท่านั้น ซึ่งหมายความว่าถ้าคุณกำลังใช้ DataTable เป็นแหล่งข้อมูลสำหรับการผูกกับตัวอย่างเช่นเซิร์ฟเวอร์ SQL แล้วเรียกAcceptChanges
ตนเองจะรับประกันได้ว่าว่าการเปลี่ยนแปลงที่ไม่เคยได้รับการบันทึกไว้ในเซิร์ฟเวอร์ SQL
สิ่งที่ทำให้ปัญหานี้สับสนมากขึ้นคือมีสองกรณีที่เกิดข้อยกเว้นและเราต้องป้องกันทั้งสองกรณี
1. การแก้ไขคอลเล็กชันของ IEnumerable
เราไม่สามารถเพิ่มหรือลบดัชนีในคอลเลกชันที่กำลังแจกแจงได้เนื่องจากการทำเช่นนั้นอาจส่งผลต่อการจัดทำดัชนีภายในของตัวแจงนับ มีสองวิธีในการแก้ไขปัญหานี้: ทำดัชนีของคุณเองใน for loop หรือใช้คอลเลกชันแยกต่างหาก (ที่ไม่ได้แก้ไข) สำหรับการแจงนับ
2. พยายามอ่านรายการที่ถูกลบ
เนื่องจาก DataTables เป็นคอลเลกชันธุรกรรมรายการสามารถถูกทำเครื่องหมายเพื่อลบ แต่ยังคงปรากฏในการแจงนับ ซึ่งหมายความว่าหากคุณถามรายการที่ถูกลบสำหรับคอลัมน์"name"
นั้นจะทำให้เกิดข้อยกเว้น ซึ่งหมายความว่าเราต้องตรวจสอบว่าdr.RowState != DataRowState.Deleted
ก่อนที่จะค้นหาคอลัมน์
วางมันทั้งหมดเข้าด้วยกัน
เราอาจจะยุ่งและทำทุกอย่างด้วยตนเองหรือเราสามารถปล่อยให้ DataTable ทำงานทั้งหมดให้เราและทำให้คำสั่งมีลักษณะเหมือนการเรียก SQL โดยทำดังต่อไปนี้
string name = "Joe";
foreach(DataRow dr in dtPerson.Select($"name='{name}'"))
dr.Delete();
ด้วยการเรียกSelect
ใช้ฟังก์ชันของ DataTable แบบสอบถามของเราจะหลีกเลี่ยงรายการที่ลบไปแล้วใน DataTable โดยอัตโนมัติ และเนื่องจากSelect
ฟังก์ชันส่งคืนอาร์เรย์ของการจับคู่คอลเลคชันที่เรากำลังแจกแจงอยู่จะไม่ถูกแก้ไขเมื่อเราเรียกdr.Delete()
ใช้ ฉันยังเพิ่มนิพจน์ Select ด้วยการแก้ไขสตริงเพื่อให้สามารถเลือกตัวแปรได้โดยไม่ทำให้โค้ดมีเสียงดัง
[ii]
ไป[i]
แต่ :-)