2009-09-11 29 views
13

Tengo una lista desplegable dentro de una vista de cuadrícula, que se carga desde un origen de datos cuando se carga la vista de cuadrícula. ¿Podría alguien mostrarme cómo hago para colocar en bucle la lista desplegable y eliminar ciertos elementos de la lista en función de una condición if.Eliminar elementos de lista de DropDownList

Respuesta

35

No hay necesidad de lazo de los elementos, acaba de encontrar el elemento y quitarlo:

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

O si se conoce el índice del elemento a eliminar, utilizar el método RemoveAt:

myDropDown.Items.RemoveAt(0); 

Pero si quieres bucle de todos modos, aquí está el bucle:

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

Quiero quitar más de dos elementos –

+1

He intentado esta opción. Si elimina el segundo elemento, muestra el error System.InvalidOperationException: se modificó la colección; la operación de enumeración no se puede ejecutar. –

6

no se puede usar foreach para eliminar elementos, como una vez que ha Si eliminas un elemento, la colección se modifica y el ciclo arroja una excepción.

Si debe recorrer la colección para eliminar varios elementos, la mejor solución es realizar un ciclo hacia atrás en la colección. Mi C# está bastante oxidado, así que lo siguiente está en VB. Debería ser fácil de 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 
2

No se puede utilizar un bucle for-each porque no se puede modificar la colección mientras se utiliza el objeto de enumerador. La mejor manera de hacerlo es contar hacia atrás según lo indicado por @Jason. O utilizar un bucle como este:

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

Ten en cuenta que después de quitar el ListItem, el recuento DropDownList elemento cambia. Por lo tanto, deberá disminuir su contra variable i, o corre el riesgo de no evaluar todos los elementos.

+0

Esto funcionó para mí. Gracias – Fandango68

0

Por qué no puede usar for each item in mycollection.ToList() De esta manera puede realizar cambios durante la iteración a través de su lista, ya que la colección se convierte en una copia de una lista y no en la propia lista.

Cuestiones relacionadas