Comment puis-je utiliser la méthode foreach au lieu de supprimer pour la méthode avec la méthode de la boîte de liste?

StackOverflow https://stackoverflow.com/questions/720625

  •  23-08-2019
  •  | 
  •  

Question

Comment puis-je utiliser secondes méthode au lieu de premier

premier (contrôle utilisateur Web)

   public void Remove()
        {

            int count = this.ListBox1.Items.Count;

            for (int i = count - 1; i > -1; i--)
            {
                if (ListBox1.Items[i].Selected)
                {
                    ListBox1.Items.Remove(ListBox1.Items[i]);
                }
            }
        }

Test.aspx (Test de la première)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
            ItemOrderer2.Remove();

        }

secondes (contrôle utilisateur Web)

 public void Remove(string value)
        {
            ListItem li = new ListItem();
            li = ListBox1.Items.FindByValue(value);
            if (li != null)
            {
                this.ListBox1.Items.Remove(li);
            }

Test.aspx (Test de seconde)

  protected void btnRemove_Click(object sender, EventArgs e)
        {
           // ItemOrderer2.Remove();
            if (ItemOrderer2.Items.Count > 0)
                foreach (ListItem li in ItemOrderer2.Items)
                {
                    if (li.Selected)
                    {
                        ItemOrderer2.Remove(li.Value);
                    }
                }
        }
Était-ce utile?

La solution

Vous ne pouvez pas utiliser foreach si vous supprimez des données à l'intérieur du foreach - il (intentionnellement) brise le iterator

.

Si les travaux de for, pourquoi le changer? Si vous êtes désespérée à utiliser foreach, puis construire une séparés première liste - par exemple:

List<ListItem> remove = new List<ListItem>();
foreach(ListItem li in ItemOrdere2.Items) {
    if(li.Selected) remove.Add(li);
}
foreach(ListItem li in remove) {
    ItemOrderer2.Remove(li); // or similar
}

La première requête peut souvent être simplifiée par LINQ si si est disponible.

Autres conseils

Vous pouvez obtenir les valeurs à supprimer d'abord à une liste, puis les exécuter par la fonction de suppression. Cela peut être encore améliorée si nécessaire.

var removedValues = ItemOrderer2.Items
                    .Where(li => li.Selected)
                    .Select(li => li.Value).ToList();

foreach (var removedValue in removedValues) {
   ItemOrderer2.Remove(removedValue);
}

Vous ne pouvez pas modifier une collection que vous itérez dans une boucle foreach.

Cela étant dit, il semble que vous essayez de supprimer les éléments sélectionnés à partir d'un ListBox. Vous pouvez également utiliser quelque chose comme:

while(ItemOrderer2.SelectedItem != null)
{
    ItemOrderer2.Items.Remove(ItemOrderer2.SelectedItem);
}

Eh bien, vous ne pouvez pas apporter des modifications à un IList <> avec foreach, tout simplement parce que cela changerait le nombre d'éléments en elle.

En outre, la 1ère méthode que vous montriez sont défectueux, puisque le nombre pourrait commencer 20 mais si vous supprimez 10 éléments avec votre méthode, le nombre sera toujours 20 et vous iriez en dehors des limites du IList <>

En fait, si vous voulez supprimer / ajouter des choses en itérer dessus, vous devez faire quelque chose comme

for (int i = 0; i < ListBox1.Items.Count; i++)
{
   if (ListBox1.Items[i].Selected)
   {
      ListBox1.Items.RemoveAt(i)
      i--;
   }
}

Remarquez la je-- si vous supprimez quoi que ce soit. Disons que l'article [2] est sélectionné, votre boucle irait:

  1. si Count> 0 procéder
  2. si l'article [0] est sélectionné, retirez-le (ce n'est pas)
  3. incrémenter notre compteur
  4. si comte> 1 procéder
  5. si l'article [1] est sélectionné, retirez-le (ce n'est pas)
  6. incrémenter notre compteur
  7. si comte> 2 procéder
  8. élément [2] est sélectionné, la retirer (il)
  9. supprimer l'article [2] (maintenant, ce qui était auparavant l'article [3] sera point [2]
  10. décrémenter notre compteur
  11. incrémenter notre compteur
  12. si comte> 2 procéder
  13. ...

Hope this helps:)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top