2008-11-24 27 views
7

Tôi đã điền một Datatable, từ 2 máy chủ khác nhau. Tôi có thể điều chỉnh độ dài của mình> 0, những gì tôi muốn làm là xóa các hàng không được nhấn. Dưới đây là tóm tắt về những gì tôi cóLooping thông qua một hàng có thể định vị và xóa hàng

DataRow[] dr = payments.dtPayments.Select(myselect); 

if (dr.Length > 0) 
{ 
    for (int a = 0; a < dr.Length; a++) 
    { 
     if (thisOption == true) 
     dr[0].Delete(); 
     else if (otherOption == true) 
     { 
     dr[0]["Date"] = myDataReader["date"].ToString().Trim(); 
     dr[0]["Pay"] = payTypeName(myDataReader["ccdsrc"].ToString() 
                  .Trim()); 
     } 
    } 
} 
if (dr.Length == 0) 
{       
    if (LastOption == true) 
    { 
    //DataRow should be removed 
    }       
} 

Trả lời

4

Nếu dr.Length là 0, thì lựa chọn của bạn không trả về bất kỳ hàng nào. Nếu bạn muốn xóa các hàng không khớp với tiêu chí của mình, thì tôi sẽ triển khai các hàng đó dưới dạng một loại truy vấn khác. Nó cũng có thể là tôi hoàn toàn hiểu lầm câu hỏi của bạn. Bạn có thể cập nhật câu hỏi của bạn để hiển thị SQL của bạn và chỉ ra nơi trong mẫu mã bạn đang gặp vấn đề: bên trong vòng lặp hoặc sau vòng lặp nơi bạn có bình luận của bạn?

+0

bạn đã đúng. Tôi nhận ra rằng tôi không trả lại bất kỳ hàng nào. Những gì tôi đã làm là tạo một tập dữ liệu mới và điền vào các hàng với những gì tôi đã tìm thấy. Cảm ơn –

1

Bạn đã thử cái này chưa?

payments.dtPayments.Rows.Remove (dr)

+0

Tôi đã làm và tôi đã xem xét kỹ hơn. Lần đầu tiên tôi có dr [0] .delete, tôi đã có những gì bạn đề nghị (cả dr và dr [0]) và chỉ số lỗi nằm ngoài giới hạn của mảng là lỗi của tôi. Có cách nào để sửa chữa điều đó không? –

18

Tôi không chắc tôi hoàn toàn hiểu câu hỏi của bạn nhưng có vẻ như bạn cố gắng để xóa một mục từ bộ sưu tập trong khi bạn vẫn đang lặp qua nó. (Mà sẽ gây ra một lỗi chỉ số mảng)

Bạn nên lưu một tham chiếu đến mỗi mục bạn muốn xóa trong một bộ sưu tập mới và sau đó loại bỏ tất cả các mục mới từ bộ sưu tập cũ:

DataRow[] dr = payments.dtPayments.Select(myselect); 
List<DataRow> rowsToRemove = new List<DataRow>(); 

for (int a = 0; a < dr.Length; a++) { 
    if(/* You want to delete this row */) { 
     rowsToRemove.Add(dr[a]); 
    } 
} 

foreach(var dr in rowsToRemove) { 
    payments.dtPayments.Rows.Remove(dr); 
} 
+0

Bạn là thiên tài! –

2

Bạn cần để tạo ra một datarow bên ngoài vòng lặp, sau đó khi bạn nhận được đến hàng bạn muốn loại bỏ gán nó vào hàng bạn tạo ra bên ngoài. và phá vỡ vòng lặp. Sau đó, dưới vòng lặp, bạn có thể loại bỏ nó.

DataRow r = null; 
foreach(DataRow row in table.Rows) 
{ 
    if(condition==true) 
    { 
     r = row; 
     break; 
    } 
} 

table.Rows.Remove(r); 
1

Bạn có thể lặp lại bộ sưu tập ngược lại (cho (int i = rows.length-1; x> -1; x--)) để xóa nhiều hàng để đảm bảo bạn sẽ không nhận được chỉ mục ngoài các lỗi bị ràng buộc .

+0

Tôi thích điều này tốt hơn rất nhiều so với vòng lặp đôi. Đây luôn là phương pháp ưa thích của tôi. – Richard

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