从列表框中删除所选项目

Cri*_*sto 18 c# listbox

我想这样做但是,列表框会在每次删除时发生更改,因此即使我尝试执行新对象,它也会引发运行时异常.

我试过这样的:

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");
Run Code Online (Sandbox Code Playgroud)

Pat*_*irk 31

foreach通过它迭代(使用a )时无法修改集合.而是使用反向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");
Run Code Online (Sandbox Code Playgroud)

使用反向循环可确保您在删除后不会跳过任何内容.

  • 是的,就是这样!谢谢!只是一点修正:for(int i = selectedItems.Count - 1; i> = 0;**i - **) (2认同)
  • 如果某个项目在“项目”列表中出现两次并且仅选择第二个,则可能会出现一个小错误。我认为第一个可能会被删除。使用 Items.RemoveAt(i) 的解决方案可能会稍微好一些。但更重要的是逆转迭代! (2认同)

hor*_*rgh 9

selectedItems = lstClientes.SelectedItems;
Run Code Online (Sandbox Code Playgroud)

此行不会创建新集合,但会设置对列表框中的集合的引用.因此,您正在遍历集合并尝试立即从中删除项目.这不可能

你可以使用它,例如:

foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
   lstClientes.Items.Remove(s);
Run Code Online (Sandbox Code Playgroud)


Nin*_*ham 6

简单就像这样:

while (lst.SelectedItems.Count > 0)
{
   lst.Items.Remove(lst.SelectedItems[0]);
}
Run Code Online (Sandbox Code Playgroud)


小智 5

lst.Items.Remove(lst.Items[lst.SelectedIndex]);
Run Code Online (Sandbox Code Playgroud)

如果您不想循环,可以使用它

注意:这只适用于删除 1 个项目(多选只会删除第一个选定的项目)