2009-09-11 19 views
13

Mam dropdownlist wewnątrz gridview, który jest ładowany ze źródła danych, gdy ładuje gridview. Czy ktoś mógłby mi pokazać, jak mam zamiar zapętlić listę rozwijaną i usunąć niektóre elementy z listy na podstawie warunku if.Usuwanie pozycji listy z DropDownList

Odpowiedz

35

Nie trzeba pętli pozycje, wystarczy znaleźć pozycję i wyjąć go:

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

Lub jeśli znasz indeks elementu do usuwania, należy użyć metody RemoveAt:

myDropDown.Items.RemoveAt(0); 

Ale jeśli chcesz pętli tak, tutaj jest pętla:

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

Chcę usunąć więcej niż dwie pozycje –

+1

Próbowałem tej opcji. po usunięciu drugiego elementu pokazuje błąd System.InvalidOperationException: Kolekcja została zmodyfikowana; operacja wyliczania może nie zostać wykonana. –

6

nie można używać foreach aby usunąć elementy, jak kiedyś was ha ve usunął element, kolekcja została zmodyfikowana, a pętla generuje wyjątek.

Jeśli konieczne jest przeglądanie kolekcji w celu usunięcia wielu elementów, najlepszym rozwiązaniem jest przechodzenie wstecz do kolekcji. Moje C# jest dość zardzewiałe, więc poniżej jest w VB. Powinien być łatwy do konwersji.

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

Nie można użyć dla każdej pętli, ponieważ nie można modyfikować kolekcji podczas korzystania z obiektu Enumerator. Najlepszym sposobem na to jest policzenie wstecz, jak stwierdził @Jason. Lub użyć pętli for tak:

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; 
    } 
} 

Wystarczy pamiętać, że po usunięciu ListItem, liczba DropDownList pozycja ulegnie zmianie. Musisz więc zmniejszyć swoją zmienną licznika i, bo inaczej ryzykujesz, że nie ocenisz wszystkich elementów.

+0

To zadziałało dla mnie. Dziękuję Ci – Fandango68

0

Dlaczego nie można użyć for each item in mycollection.ToList() W ten sposób można wprowadzać zmiany podczas iteracji za pośrednictwem listy, ponieważ kolekcja jest konwertowana na kopię listy, a nie na samą listę.