0

リストボックスから選択したアイテムを取得し、リストからこのアイテムを削除するボタンクリックから実行されるこのメソッドを使用しようとしています。コードを実行するたびに、「この列挙子がバインドされているリストが変更されました。列挙子は、リストが変更されない場合にのみ使用できます。」というエラーが表示されます。

私は完全に困惑しています。

    public void DeleteSale()
    {
        foreach (BootSale b in lstBootSales.SelectedItems)
        {

            lstBootSales.Items.Remove(b.Id);
            lstBootSales.Items.Remove(b.Date);

            DisplayAllBootSales();
        }
    }

DisplayAllBootSales();後でリストボックスの値を更新するだけです

リストボックスに書き込まれる情報を格納するリスト「BootSale」があります。リストボックス内のアイテムをクリックしてから[削除]をクリックすると、システムから完全に削除されます。

4

5 に答える 5

2

エラーメッセージはそれをすべて示しています。繰り返し処理しているリストからアイテムを削除することはできません。foreachループの外側のアイテムを削除する必要があります。簡単な修正の1つは、代わりに通常のforループを使用することです。

于 2013-02-28T14:43:05.017 に答える
2

これを行う:

class Foo {

    BootSaleList bootsalelist;

    public void DeleteSale()
    {
        foreach (BootSale b in lstBootSales.SelectedItems.OfType<BootSale>().ToArray())
        {
            //temp.Remove(b); -- no more of this guy
            bootsalelist.ReturnList().Remove(b);
            lstBootSales.Items.Remove(b);

            // and no more of these guys:

            //lstBootSales.Items.Remove(b.Id); 
            //lstBootSales.Items.Remove(b.Date);
            //DisplayAllBootSales();
        }
    }

 }

どこ:

[Serializable]
public class BootSaleList : IDisplay
{
    private List<BootSale> bootsales;

    public List<BootSale> ReturnList()
    {
        return bootsales;
    }
}

そしてそれは完璧に動作します

于 2013-02-28T14:43:09.427 に答える
1

foreach 内からコレクションを変更することはできませんが、次のような一時的なリストを使用できます。

public void DeleteSale()
{
    List<T> temp = lstBootSales;
    foreach (BootSale b in lstBootSales.SelectedItems)
    {
        temp.Items.Remove(b.Id);
        temp.Items.Remove(b.Date);

        DisplayAllBootSales();
    }

    lstBootSales = temp;
}
于 2013-02-28T14:44:14.120 に答える
1

これを行う最善の方法は、リストを上から下にループすることです (下から上ではなく)

for(int i = YourListItems.Count(); i > 0; i--)
{
    // Remove from list
}

この方法により、インデックス エラーを防ぐことができます。

幸運を

于 2013-02-28T14:54:03.390 に答える
0

私が推測するかもしれないあなたのコードを見ると、それlstBootSalesはのリストを保持していますBootSale。しかし、BootSaleとは異なるものを削除しようとしています。forforeachの代わりにも使用します:

        for (int i = 0; i < lstBootSales.SelectedItems.Count; i++)
        {
            lstBootSales.Items.Remove(lstBootSales.SelectedItems[i]);

            DisplayAllBootSales();
        }
于 2013-02-28T14:47:31.950 に答える