2010-06-30 26 views
11

Tôi có một bảng dữ liệu và tôi muốn xóa một hàng ở đây là mã của tôi nó ném cho tôi một ngoại lệBảng dữ liệu + xóa một hàng trong C# sử dụng vòng lặp

foreach (DataRow row in dt1.Rows) 
{ 
    if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook")) 
    { 
     row.Delete(); 
     dt1.AcceptChanges(); 
    } 
} 

Tôi thậm chí đã cố gắng bên ngoài nếu Statment và ngoài forloop vẫn ném cho tôi lỗi bất kỳ ý tưởng làm thế nào để đạt được nhiệm vụ này này là ngoại lệ tôi nhận được:

Collection was modified; enumeration operation might not execute. 

cuối cùng Mã làm việc:

foreach (DataRow row in dt1.Select()) 
{ 
    if ((row["Name"] == "Select a Lookbook") || (row["Name"] == "Create a new Lookbook")) 
    { 
     row.Delete();          
    } 

} 
+1

thể trùng lặp của [an toàn Loại bỏ DataRow Trong ForEach] (http://stackoverflow.com/questions/2341580/safely-removing-datarow-in-foreach) – ChrisF

Trả lời

17

Thay vì sử dụng dt1.Rows, sử dụng dt1.Select()

Mục tiêu ở đây không phải là để sử dụng bộ sưu tập riêng của mình, mà đúng hơn một mảng hàng không phải là bộ sưu tập Rows

+0

Làm việc chính xác như tôi muốn, Cảm ơn – Developer

+0

@Pierre: Bạn đã cứu tôi, cảm ơn bạn rất nhiều :) – Chiramisu

9

Tạo danh sách các hàng cần xóa trong khi lặp lại trên DataTable.Rows, sau đó xóa tất cả các hàng riêng biệt.

Non-LINQ giải pháp: giải pháp

List<DataRow> rowsToDelete = new List<DataRow>(); 
foreach (DataRow row in dt1.Rows) 
{ 
    if ((row["Name"] == "Select a Lookbook") || 
     (row["Name"] == "Create a new Lookbook")) 
    { 
     rowsToDelete.Add(row); 
    } 
} 
foreach (DataRow row in rowsToDelete) 
{ 
    row.Delete(); 
} 
dt1.AcceptChanges(); 

LINQ:

List<DataRow> rowsToDelete = dt1.Rows.AsEnumerable() 
    .Where(row => (row["Name"] == "Select a Lookbook") || 
        (row["Name"] == "Create a new Lookbook")) 
    .Tolist(); 
foreach (DataRow row in rowsToDelete) 
{ 
    row.Delete(); 
} 
dt1.AcceptChanges(); 
+0

Tôi biết đó là một câu trả lời rất tốt nhưng tôi có để đi với câu trả lời của Pierre như tôi tin rằng nó dễ dàng. Tôi thực sự đánh giá cao sự giúp đỡ của bạn. – Developer

1

Đây là cách tôi đã làm khi tôi gặp sự cố này.

  Dim index As Integer = 0 
      Dim count As Integer = resultsDT.Rows.Count - 1 
      For i As Integer = 0 To count 
       If resultsDT.Rows(index).Item("something") = "something" Then 
        resultsDT.Rows(index).Delete() 
        resultsDT.AcceptChanges() 
        index = index - 1 
       End If 

       index = index + 1 
       i = i + 1 
      Next 
Các vấn đề liên quan