【问题标题】:How to delete an item in listbox and collection [duplicate]如何删除列表框和集合中的项目[重复]
【发布时间】:2018-04-03 19:23:32
【问题描述】:

我有一个列表框,我想用这个列表框删除集合中的一个对象。但我只能删除第一项(选择索引 0)为什么?我解决不了这个问题

private void removeButton_Click(object sender, EventArgs e)
{
    foreach (Student element in studentCollection) {

        if (studentListbox.SelectedIndex != -1 && element.Name == studentListbox.SelectedItem.ToString())
        {
            studentCollection.Remove(element);
            studentListbox.Items.RemoveAt(studentListbox.SelectedIndex);
        }
        break;
    }
}

【问题讨论】:

  • 需要注意的一点是,您不能在 foreach 循环中从 studentCollection 中删除一个项目。
  • 那么我如何从收藏中删除一个项目?如果我不能从 foreach 循环中删除,为什么我可以删除第一项?
  • foreach 循环在使用它时更改集合时不喜欢它。 for 循环不会介意,但您必须跟踪索引。另一种选择是使用循环查找项目,保存索引或对象引用,并在打破循环后删除。
  • 你代替循环它。如果您改用 BindingList 并让 ListBox 使用 BindingList 作为数据源,则只需从源中删除项目即可。

标签: c# winforms listbox


【解决方案1】:

使用 For 循环而不是 foreach 循环。 Foreach 循环无法工作,因为您的集合中的项目数会不断变化。

类似这样的:

private void removeButton_Click(object sender, EventArgs e)
{
        student element;
        for (int i = 0; i < studentCollection.items.count; i++)
        {
            element = studentCollection[i];
            //Remove your item here
        }
}

【讨论】:

  • 最好跳出该循环或向后迭代以避免错误。
  • 如果我使用 for 循环,那么如何在 studentCollection 中找到列表框选定项目名称?
  • 我编辑了我的答案。您在循环之前定义“元素”。然后你可以找到这样的名字:name = element.Name 或者简单地说:studentCollection[i].Name
  • 是的,这段代码也有效,我没有注意我可以使用这个:element = studentCollection[i]; :)
【解决方案2】:
var index = studentListbox.SelectedIndex;
if (index != -1)
{
    var student = studentCollection.First(s => s.Name == studentListbox.SelectedValue.ToString());
    studentCollection.remove(student);
    studentListbox.Items.RemoveAt(index);
}

这就是你真正需要写的。

首先抓取索引以减少重复和潜在错误。

然后我们使用 LINQ first 方法来定位学生。

然后我们删除学生。

最后我们删除了关联的列表项。

【讨论】:

  • 我试了一下,但它给出了 InvalidOperationException
  • @amirmehr 我忘记了 to 字符串,这可能就是原因。我假设您在调用 First 时遇到了异常?
  • 是的,它有效:) 我改变了这一行: var student = studentCollection.First(element => element.Name == studentListbox.SelectedItem.ToString());但我不能使用 LINQ 我应该学习它
  • @amirmehr 没什么,如果你能理解那条线的作用,那么你就成功了。是的,你绝对必须学习它。如果您说您知道该语言,则假定您知道 Linq。这是公理的
  • @amirmehr 是什么让另一个答案更好?这样更简单,更容易维护
猜你喜欢
  • 2015-11-24
  • 1970-01-01
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2017-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多