我想这样做但是,列表框会在每次删除时发生更改,因此即使我尝试执行新对象,它也会引发运行时异常。
我试过这样:
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");
答案 0 :(得分:29)
通过它迭代(使用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");
使用反向循环可确保您在删除后不会跳过任何内容。
答案 1 :(得分:8)
selectedItems = lstClientes.SelectedItems;
此行不会创建新集合,但会设置对列表框中的集合的引用。因此,您正在遍历集合并尝试立即从中删除项目。这是不可能的
你可以使用它,例如:
foreach (string s in lstClientes.SelectedItems.OfType<string>().ToList())
lstClientes.Items.Remove(s);
答案 2 :(得分:6)
简单就像这样:
while (lst.SelectedItems.Count > 0)
{
lst.Items.Remove(lst.SelectedItems[0]);
}
答案 3 :(得分:2)
lst.Items.Remove(lst.Items[lst.SelectedIndex]);
如果您不想循环
,可以使用此功能注意:这仅用于删除1个项目(多个选项,它只会删除第一个选定的项目)
答案 4 :(得分:1)
我找到了更好的解决方案。
if (listBoxIn.SelectedItems.Count != 0)
{
while (listBoxIn.SelectedIndex!=-1)
{
listBoxIn.Items.RemoveAt(listBoxIn.SelectedIndex);
}
}
答案 5 :(得分:1)
我今天遇到了同样的问题,想要更清洁的东西,并提出了这个Linq解决方案:
foreach (int index in myListBox.SelectedIndices.Cast<int>().Select(x => x).Reverse())
myListBox.Items.RemoveAt(index);
基本上与Patrick的向后迭代和删除所选项目的解决方案相同。但是,我们不是向后迭代,而是反转要删除的项目列表并向前迭代。我们不再迭代原始枚举,因此我们可以删除foreach中的项目。
答案 6 :(得分:0)
这是删除所选项目的最简单方法
for(int v=0; v<listBox1.SelectedItems.Count; v++) {
listBox1.Items.Remove(listBox1.SelectedItems[v]);
}
答案 7 :(得分:0)
创建一个全局变量:
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);
答案 8 :(得分:0)
要以帕特里克的答案为基础,我倾向于使用反向索引删除,因为它会保留要删除的项的索引,而这些项在删除时不会删除相同的项。
private void BtnDelete_Click(object sender, EventArgs e) {
if (listBox.SelectedIndex == -1) {
return;
}
// Remove each item in reverse order to maintain integrity
var selectedIndices = new List<int>(listBox.SelectedIndices.Cast<int>());
selectedIndices.Reverse();
selectedIndices.ForEach(index => listBox.Items.RemoveAt(index));
}