2009-09-11 40 views
13

Tôi có danh sách thả xuống bên trong chế độ xem lưới, được tải từ nguồn dữ liệu khi tải GridView. Có thể ai đó xin vui lòng chỉ cho tôi cách tôi đi về looping danh sách thả xuống và loại bỏ một số mặt hàng từ danh sách dựa trên một điều kiện nếu.Xóa mục danh sách khỏi DropDownList

Trả lời

35

Không cần phải vòng lặp các mục, chỉ cần tìm các mục và loại bỏ nó:

ListItem itemToRemove = myDropDown.Items.FindByValue("value"); 
if (itemToRemove != null) 
{ 
    myDropDown.Items.Remove(itemToRemove); 
} 

Hoặc nếu bạn biết chỉ số của mặt hàng đó để loại bỏ, sử dụng phương pháp RemoveAt:

myDropDown.Items.RemoveAt(0); 

Nhưng nếu bạn muốn lặp lại, đây là vòng lặp:

foreach (ListItem item in myDropDown.Items) 
{ 
    // your stuff 
} 
+1

tôi muốn xóa nhiều hơn hai mục –

+1

tôi đã thử tùy chọn này. trong đó loại bỏ mục thứ hai nó cho thấy lỗi System.InvalidOperationException: Bộ sưu tập đã được sửa đổi; hoạt động điều tra có thể không thực hiện được. –

6

Bạn không thể sử dụng foreach để xóa các mục, như một khi bạn ha đã loại bỏ một mục, bộ sưu tập được sửa đổi, và vòng lặp ném một ngoại lệ.

Nếu bạn phải lặp qua bộ sưu tập để xóa nhiều mục, giải pháp tốt nhất là lặp lại qua bộ sưu tập. C# của tôi là khá gỉ, do đó, sau đây là trong VB. Nên dễ dàng chuyển đổi.

For x As Integer = myDropDown.Items.Count - 1 to 0 Step -1 
    Dim item As ListItem = myDropDown.Items(x) 
    If item.TestToSeeIfItShouldBeRemoved = True 
     myDropDown.Items.RemoveAt(x) 
    End If 
End For 
2

Bạn không thể sử dụng vòng lặp cho mỗi vì bạn không thể sửa đổi bộ sưu tập khi sử dụng đối tượng điều tra viên. Cách tốt nhất để làm điều đó là đếm ngược như đã nêu bởi @ Jason. Hoặc sử dụng một vòng lặp for như thế này:

for (int i = 0; i < this.MyDropDownList.Items.Count; i++) 
{ 
    //test to see if this item needs to be removed or not 
    if (IsToBeRemoved(this.MyDropDownList.Items[i])) 
    { 
     this.MyDropDownList.Items.Remove(this.MyDropDownList.Items[i]); 
     //re-set to next item in the list (count changed after item removed) 
     i -= 1; 
    } 
} 

Chỉ cần lưu ý rằng sau khi bạn loại bỏ các ListItem, số DropDownList mục sẽ thay đổi. Vì vậy, bạn sẽ cần phải giảm biến truy cập của bạn i, nếu không bạn có nguy cơ không đánh giá tất cả các mục.

+0

Điều này làm việc cho tôi. Cảm ơn bạn – Fandango68

0

Tại sao bạn không thể sử dụng for each item in mycollection.ToList() Bằng cách này, bạn có thể thực hiện thay đổi trong quá trình lặp qua danh sách, vì bộ sưu tập được chuyển thành bản sao danh sách chứ không phải danh sách thực.

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