【问题标题】:listBox selectedItem issuelistBox selectedItem 问题
【发布时间】:2012-07-19 11:27:30
【问题描述】:

这很好用:

private void btnDelete_Click(object sender, EventArgs e)
{
    for (int i = 0; i < listBox1.SelectedItems.Count; i++) 
    {
        listBox1.Items.Remove(listBox1.SelectedItems[i].ToString());
        i--;
    }
}

但这不起作用:

private void btnDelete_Click(object sender, EventArgs e)
{
    listBox1.Items.Remove(listBox1.SelectedItems);
}

为什么第二个btnDelete_Click 不起作用?我的意思是我用鼠标在listBox1 上选择一行,然后按下按钮。 .Remove 函数不能识别我选择了哪一行?即使我说.Remove(listBox1.SelectedItem),是否必须拥有和 selectedItem 数组? SelectedItems 这个词不是不言自明吗?而且由于我用鼠标单击了listBox1 上的行,程序或IDE 无法理解选择了哪一行?为什么我还要用SelectedItems[i]

【问题讨论】:

  • 出于兴趣,你为什么在第一个电话上打电话给ToString()?删除方法采用 object 类型。
  • 你为什么要做 i--,你循环遍历所有项目并锁定循环删除 i--;或者向我解释你为什么这样做,看看我的回答
  • yes Bali C ur right 不需要 ToString()
  • @JohnnBlade 这一定是因为当删除该项目时,剩余项目的索引将向下移动一个。我想如果你想要的话,你可以在那里添加它:)
  • 巴厘岛 C 我们不需要我——吗?我认为我们需要,但我无法解释。约翰问为什么我们需要这样做?你能解释一下巴厘岛C

标签: c# winforms listbox


【解决方案1】:

第二个示例不起作用的原因是因为您试图以要一次删除的集合的形式传递多个项目。

要删除一个项目,您需要一次完成一个,因此您需要一个循环。

另外,我可以建议改用ListView 吗?我个人发现它们更易于使用,有更多选项。

例如,您可以只用这个来为 ListView 创建循环

foreach (ListViewItem item in listView1.SelectedItems)
{
    item.Remove();
}

如果您尝试一次只删除一个选定的项目,那么您可以这样做

listBox1.Items.Remove(listBox1.SelectedItem);

SelectedItem 而不是SelectedItems,复数是它无法在没有循环的情况下处理的集合,单数是它可以理解的单个项目。

【讨论】:

  • ok Bali C 感谢 ListView 的内容。正如你所指出的,这似乎更容易。关于你给出的原因,我没有选择多行。而且我没有打开该属性,我只能选择一行而不是多行,并且我只能选择一项来删除一项。不是多个项目。对不起,如果我理解错了。你有没有更深入的说法或解释。谢谢。
  • 好的,现在看看我的回答,如果我理解的话,希望能回答你的问题:)
  • 感谢 Bali C 现在已经很清楚了,我要在这里感谢所有加入我的问题和启发的人。
  • 我想你一定是这个意思:)
【解决方案2】:

我认为 SelectedItems 需要索引号。 也许这就是你不能删除任何项目的原因。

【讨论】:

  • 是的,根据我的经验,它需要索引号,但为什么呢?我选择了这条线,然后我使用 .Remove 程序或 IDE 不能理解吗?为什么我需要给出索引号?这就是问题!!!
【解决方案3】:

listBox1.SelectedItems 返回所选项目的集合。要删除项目,您只能使用Remove() 传入集合中的单个对象,或者使用RemoveAt() 传递集合中对象的索引。

移除一个对象:

listBox1.Items.Remove(listBox1.SelectedItem);

删除索引处的对象:

listBox1.Items.RemoveAt(5);

没有您正在寻找的 RemoveRange() 方法。

【讨论】:

    【解决方案4】:

    ListBox.Items.Remove() 期望 单个项目 被删除,而 ListBox.SelectedItems 返回一个项目集合SelectedObjectCollection) - 即使只选择了一项!

    您可以编写一个扩展方法来删除所有选定的项目:

    public static class ListBoxExtension
    {
        public static void RemoveSelectedItems(this ListBox source)
        {
            if(source==null) return;
            while(source.SelectedItems.Count!=0)
            {
                source.Items.Remove(source.SelectedItems[0]);
            }
        }
    }
    

    可以这样使用:

    this.listbox1.RemoveSelectedItems();
    

    【讨论】:

    • 我试过 this.listBox1.RemoveSelectedItems();但它不工作。在 this.listBox1 之后。没有像 RemoveSelectedItems() 之类的东西
    • 是的,这就是你需要定义扩展方法的原因。
    • 有一个扩展方法,全部复制到一个新的类中,然后你会看到一个扩展方法添加到你的列表框
    • 是的,好吧,约翰,我错过了。实际上迷失在所有的谈话中。我的头开始转动:)
    • 现在给我们大家一些投票和积分,让我们和你聊这么久:)
    【解决方案5】:

    也变了

    for (int i = 0; i < listBox1.SelectedItems.Count; i++) 
    {
        listBox1.Items.Remove(listBox1.SelectedItems[i].ToString());
        i--;
    }
    

        for (int i = (listBox1.SelectedItems.Count - 1); i >= 0; i--)
        { 
          listBox1.Items.Remove(listBox1.SelectedItems[i]);
        }
    

    这应该是

     listBox1.Items.Remove(listBox1.SelectedItem);
    

    【讨论】:

    • 你读过这个问题吗?我已经知道哪一个在工作,约翰,我不是在寻找更正?我已经经历过我需要给出索引号,但为什么?我解释了我的问题。请您再读一遍并赐教,谢谢。
    • 为什么要加 i--;除非您希望循环停留在索引 0 处,否则不需要它
    • 你能解释一下为什么它是一种奇怪的做法或错误的做法,也就是你所说的坏做法吗?如果你开导我会很高兴。谢谢。
    • 这里有足够的信息让你下定决心stackoverflow.com/questions/207038/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    • 2013-04-25
    相关资源
    最近更新 更多