Como posso usar o método foreach em vez de para o método com o método de remoção da caixa de listagem?

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

  •  23-08-2019
  •  | 
  •  

Pergunta

Como posso usar segunda método em vez de primeira ?

primeira (controle de usuário da 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 (Teste de primeiro)

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

        }

segundo (controle de usuário da 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 of Second)

  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);
                    }
                }
        }
Foi útil?

Solução

Você não pode usar foreach se você está removendo os dados dentro do foreach -. Ele (intencionalmente) quebra o iterador

Se as obras for, por que mudar? Se você é desesperada usar foreach, em seguida, construir um separado primeira lista - por exemplo:

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
}

A primeira consulta pode muitas vezes ser simplificada LINQ se se está disponível.

Outras dicas

Você pode obter os valores a serem removidos em primeiro lugar a uma lista e, em seguida, executá-los através da função de remoção. Isso pode ser reforçada se necessário.

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

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

Você não pode modificar uma coleção que você está interagindo sobre em um loop foreach.

Dito isto, parece que você está tentando remover os itens selecionados de uma caixa de listagem. Você também pode usar algo como:

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

Bem, você não pode fazer quaisquer alterações em um IList <> com foreach, simplesmente porque isso mudaria o número de itens na mesma.

Além disso, o primeiro método que você mostrou são falhos, desde contagem poderia começar como 20, mas se você remover 10 itens com seu método, a contagem ainda será 20 e você iria para fora dos limites na IList <>

Basicamente, se você deseja remover o material / add enquanto iteração sobre ele você tem que fazer algo como

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

Observe o i-- se você remover qualquer coisa. Vamos item de dizer [2] é selecionado, seu loop iria:

  1. Se a contagem> 0 prosseguir
  2. se o item [0] for selecionado, removê-lo (não é)
  3. incrementar nosso contador
  4. Se a contagem> 1 proceder
  5. se o item [1] for selecionado, removê-lo (não é)
  6. incrementar nosso contador
  7. Se a contagem> 2 prosseguir
  8. item [2] é seleccionado, removê-lo (isto é)
  9. item de remover [2] (agora, o que antes era item [3] será item [2]
  10. diminuir o nosso counter
  11. incrementar nosso contador
  12. Se a contagem> 2 prosseguir
  13. ...

Espero que isso ajude:)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top