web-dev-qa-db-fra.com

Supprimer des éléments de liste de DropDownList

J'ai une liste déroulante à l'intérieur d'une grille, qui est chargé à partir d'une source de données lorsque la grille est chargée. Quelqu'un pourrait-il me montrer comment faire pour boucler la liste déroulante et supprimer certains éléments de la liste en fonction d'une condition if.

14
Geetha

Pas besoin de mettre en boucle les éléments, il suffit de trouver l'élément et de le supprimer: 

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

Ou, si vous connaissez l'index de l'élément à supprimer, utilisez la méthode RemoveAt: 

myDropDown.Items.RemoveAt(0);

Mais si vous voulez quand même boucler, voici la boucle: 

foreach (ListItem item in myDropDown.Items)
{
    // your stuff
}
36
Canavar

Vous ne pouvez pas utiliser foreach pour supprimer des éléments, car une fois que vous avez supprimé un élément, la collection est modifiée et la boucle lève une exception.

Si vous devez parcourir la collection pour supprimer plusieurs éléments, la meilleure solution consiste à effectuer une boucle arrière dans la collection. Mon C # est assez rouillé, donc ce qui suit est en VB. Devrait être facile à convertir.

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
7
Jason Berkan

Vous ne pouvez pas utiliser de boucle for-each car vous ne pouvez pas modifier la collection lorsque vous utilisez l'objet énumérateur. La meilleure façon de le faire est de compter à rebours comme l'a déclaré @Jason. Ou utilisez une boucle for comme ceci:

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

Notez simplement qu'après avoir supprimé la variable ListItem, le nombre d'éléments DropDownList sera modifié. Vous devrez donc décrémenter votre variable de compteur i, sinon vous risquez de ne pas évaluer tous les éléments.

2
J.Hendrix

Pourquoi ne pouvez-vous pas utiliser for each item in mycollection.ToList() Ainsi, vous pourrez apporter des modifications au cours de l'itération de votre liste, car la collection est convertie en copie de la liste et non de la liste elle-même.

0
user2441818