23

やりたいのですが、削除するたびにリストボックスが変わるので、新しいオブジェクトを実行しようとしても実行時例外がスローされます。

私はこのように試しました:

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
   selectedItems = lstClientes.SelectedItems;
if (lstClientes.SelectedIndex != -1)
{ 
    foreach (string s in selectedItems)
        lstClientes.Items.Remove(s);
}
else
    MessageBox.Show("Debe seleccionar un email");
4

9 に答える 9

41

コレクションを ( を使用して) 反復処理している間は、コレクションを変更することはできませんforeach。代わりに逆forループを使用します。

ListBox.SelectedObjectCollection selectedItems = new ListBox.SelectedObjectCollection(lstClientes);
selectedItems = lstClientes.SelectedItems;

if (lstClientes.SelectedIndex != -1)
{ 
    for (int i = selectedItems.Count - 1; i >= 0; i--)
        lstClientes.Items.Remove(selectedItems[i]);
}
else
    MessageBox.Show("Debe seleccionar un email");

逆ループを使用すると、それらを削除した後にスキップしないようになります。

于 2012-10-31T00:24:14.680 に答える
9
selectedItems = lstClientes.SelectedItems;

この行は新しいコレクションを作成しませんが、リストボックス内のコレクションへの参照を設定します。したがって、コレクションを反復処理して、コレクションからアイテムを一度に削除しようとします。それは不可能

たとえば、次のように使用できます。

foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
   lstClientes.Items.Remove(s);
于 2012-10-31T00:21:56.787 に答える
6

このように簡単です:

while (lst.SelectedItems.Count > 0)
{
   lst.Items.Remove(lst.SelectedItems[0]);
}
于 2013-08-06T15:41:36.830 に答える
5
lst.Items.Remove(lst.Items[lst.SelectedIndex]);

ループしたくない場合は、これを使用できます

注: これは 1 つのアイテムを削除する場合にのみ機能します (複数選択すると、最初に選択したアイテムのみが削除されます)。

于 2015-05-11T02:52:20.733 に答える
1

より良い解決策を見つけました。

        if (listBoxIn.SelectedItems.Count != 0)
        {
            while (listBoxIn.SelectedIndex!=-1)
            {
                listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);                  
            }
        }
于 2015-02-04T11:08:20.997 に答える
0

これは、選択したアイテムを削除する最も簡単な方法です

 for(int v=0; v<listBox1.SelectedItems.Count; v++) {
            listBox1.Items.Remove(listBox1.SelectedItems[v]);
        }
于 2015-06-28T16:09:19.810 に答える
-1

グローバル変数を作成します。

public partial class Form1 : Form
    {

        Int32 index;
    }

次に、選択したインデックスの変更で、そのインデックスを定義した var に保存します。

 private void lsbx_layers_SelectedIndexChanged(object sender, EventArgs e)
        {

           layerindex = lsbx_layers.SelectedIndices[0];//selected index that has fired the event
         }

最後に、要素を削除します:

 lsbx_layers.Items.RemoveAt(Layerindex);
于 2016-05-06T09:41:32.423 に答える