2010-05-26 47 views

Trả lời

49

Nó phụ thuộc vào những gì bạn có nghĩa là bởi 'xóa'.

Nếu bạn muốn đánh dấu chúng là đã xóa, chỉ cần gọi phương thức Delete() trên mỗi hàng khi bạn truy cập nó trong vòng lặp của mình. Sau đó, bạn cần gọi số AcceptChanges() trên bảng dữ liệu để hoàn tất việc xóa - có lẽ sau khi bạn cập nhật cơ sở dữ liệu của mình (nếu có).

foreach(DataRow row in someTable.Rows) 
{ 
    if(/* your condition here */) 
     row.Delete(); 
} 
someTable.AcceptChanges(); 

Nếu bạn có nghĩa là loại bỏ nó khỏi các DataTable, sau đó bạn cần phải làm như vậy trong hai đèo:

List<DataRow> rowsToDelete = new List<DataRow>(); 
foreach(DataRow row in someTable.Rows) 
{ 
    if(/* your condition here */) 
    { 
     rowsToDelete.Add(row); 
    } 
} 

foreach(DataRow row in rowsToDelete) 
{ 
    someTable.Rows.Remove(row); 
} 

Đó là giá trị chỉ ra rằng bạn luôn có thể sử dụng phương pháp đầu tiên để loại bỏ hàng - vì việc đánh dấu các hàng là Deleted và sau đó chấp nhận thay đổi sẽ tự động xóa chúng khỏi bảng. Tuy nhiên, đôi khi việc xóa các đối tượng DataRow rõ ràng và hiệu quả hơn từ bộ sưu tập Rows.

+0

+1 cho lời giải thích tuyệt vời này, là đáng lo ngại chút với điều này !! – Jithu

+4

Nếu bạn làm giống như những gì LBushkin đã nói, bạn sẽ thấy như sau: Bộ sưu tập đã được sửa đổi; hoạt động liệt kê có thể không thực hiện được. vì vậy nó sai. – Szjdw

+1

Miễn là bạn gọi .AcceptChanges() trước khi đánh dấu các hàng là đã xóa (trước vòng lặp foreach) thì bạn sẽ không nhận được thông báo "Bộ sưu tập đã được sửa đổi, liệt kê có thể không thực thi". Lỗi xuất hiện vì có các thay đổi đang chờ xử lý cần phải được chấp nhận. Nếu bạn sử dụng vòng lặp for thì nó sẽ không thành vấn đề, nhưng trong trường hợp đó, tốt nhất là nên lặp lại. – Soenhay

8

Hãy thử một cái gì đó giống như ví dụ này

DataTable table = new DataTable(); 
table.Columns.Add("Foo",typeof(int)); 
for (int i = 0; i < 10; i++) 
    table.Rows.Add(i); 

for (int i = table.Rows.Count -1; i >=0; i--) 
{ 
    // sample removes all even foos 
    if ((int)table.Rows[i]["Foo"] % 2 == 0) 
     table.Rows.RemoveAt(i); 
} 
+0

+1 cho lặp ngược để duy trì indicies – riffnl

+0

cũng có thể làm một vòng về phía trước (0 -> Đếm-1) nếu bạn di chuyển 'i ++' bên trong vòng lặp for và chỉ tăng khi không xóa . 'if (...) remove() else i ++' – CuppM

0

thử lặp lại kết quả của Chọn(). Điều này là khá tương tự như câu trả lời khác, nhưng tôi thấy nó trực tiếp nhất

DataRow[] r = table.Select(); 
for (int i = 0; i < r.Length; i++) 
{ 
    if (i % 2 == 0) 
     r[i].Delete(); 
} 
-2

thử

foreach(DataRow oRow in YourDataTable.Rows) 
{ 
    if ("Check You Condition") 
    { 
     YourDataTable.Rows.Remove(oRow); 
    } 
} 
+3

Bạn không thể sửa đổi bộ sưu tập trong khi lặp qua bộ sưu tập với vòng lặp foreach. –

4

Một cách khác đây là

DataRow[] DrArrCheck = DataTableName.Select("ID > 0"); 
    foreach(DataRow DrCheck in DrArrCheck) 
    { 
     DataTableName.Rows.Remove(DrCheck); 
    } 
1
public static void DeleteRowsFromDataTable(DataTable dataTable, string columnName, string columnValue) 
     { 
      IEnumerable<DataRow> dataRows = (from t in dataTable.AsEnumerable() 
              where t.Field<string>(columnName) == columnValue 
              select t); 
      foreach (DataRow row in dataRows) 
       dataTable.Rows.Remove(row); 
     } 
-1

Đây là cách tôi đã làm khi tôi gặp phải vấn đề 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 
0

tôi luôn luôn sử dụng "hai giai đoạn" cách tiếp cận LBushkin và cuối cùng tôi quyết định nó là giá trị nó để viết một hàm cho nó:

public delegate bool DataRowComparer(DataRow dr); 

    public static void RemoveDataRows(DataTable table, DataRowComparer drc) 
    { 
     List<DataRow> RowsToRemove = new List<DataRow>(); 
     foreach (DataRow dr in table.Rows) 
      if (drc(dr)) 
       RowsToRemove.Add(dr); 
     foreach (DataRow dr in RowsToRemove) 
      table.Rows.Remove(dr); 
    } 

Và bây giờ tôi có thể xóa hàng với một dòng mã (ví dụ):

RemoveDataRows(dt, row => row["StringVal"].ToString() == "B" && (Int16)(row["NumberVal"]) >= 4); 

Trong trường hợp này giúp bất cứ ai ...

(Và cách nào để furthe r viết tắt được đánh giá cao.)

4

Nếu bạn muốn có một giải pháp ngắn hơn so với những đề xuất ở trên, hãy thử Looping trên danh sách kết quả, và sử dụng một lambda như sub(x) để loại bỏ mỗi người hàng.

dt.Select("Column1 > 0").ToList.ForEach(Sub(x) dt.Rows.Remove(x)) 
1

Để xóa nhiều hàng (ví dụ 50.000 trong số 100.000) sao chép cơ sở dữ liệu nhanh hơn nhiều so với việc thực hiện cả dữ liệu.Rows.Remove (hàng) hoặc hàng.Delete(). Ví dụ:

DataRow[] rowsToKeep = datatable.Select("ID > 50000"); 
DataTable tempDataTable= rowsToKeep.CopyToDataTable; 
dataTable.Clear(); 
dataTable.Merge(tempDataTable); 
tempDataTable.Dispose(); 
Các vấn đề liên quan