如何获取列表框以禁止重复项?

时间:2012-06-14 21:45:28

标签: c# winforms

Bassicly我正在创建一个程序,将信息从xml文件读入lisbox,并允许用户将列表框中的项目传输到另一个listBox。

但我想知道如何禁止将多个项目从一个列表框导入到另一个列表框。我以为我可以以某种方式进行一次演练来检查StringBox中是否已存在String。

我想这样做的原因是因为用户可以点击x次,以便导入项目,并且它是非职业性的。

任何帮助将不胜感激,谢谢。

private void button1_Click(object sender, EventArgs e)
{
    if (!listBox.Items.Exists) // Random Idea which doesnt work
    {
        listBox2.Items.Add(listBox1.Items[listBox1.SelectedIndex]);
    }
}

2 个答案:

答案 0 :(得分:3)

private void button1_Click(object sender, EventArgs e)
{
    if (!listBox.Items.Exists) // Random Idea which doesnt work
    {
    listBox2.Items.Add(listBox1.Items[listBox1.SelectedIndex]);
    }

}

这实际上会起作用,但您需要使用Contains方法。但是,您可能错过了一个关键点。

您使用哪种类型的项目来填充ListBoxExists会调用.Equals,默认情况下会使用引用相等。因此,如果您需要根据值进行过滤,则需要为您的类型覆盖.Equals并更改语义。

例如:

class Foo 
{ 
    public string Name { get; set; }
    public Foo(string name)
    {
        Name = name;
    }
}

class Program
{
    static void Main( string[] args )
    {
        var x = new Foo("ed");
        var y = new Foo("ed");
        Console.WriteLine(x.Equals(y));  // prints "False"
    }       
}

但是,如果我们覆盖.Equals以提供值类型语义......

class Foo 
{ 
    public string Name { get; set; }
    public Foo(string name)
    {
        Name = name;
    }

    public override bool Equals(object obj)
    {
        // error and type checking go here!
        return ((Foo)obj).Name == this.Name;
    }

    // should override GetHashCode as well
}

class Program
{
    static void Main( string[] args )
    {
        var x = new Foo("ed");
        var y = new Foo("ed");
        Console.WriteLine(x.Equals(y));  // prints "True"
        Console.Read();
    }       
}

现在,您对if(!listBox.Items.Contains(item))的通话将按照您的意图运作。但是,如果您希望它继续工作,则需要将该项目添加到两个列表框中,而不仅仅是listBox2

答案 1 :(得分:1)

这应该为你做...

private void button1_Click(object sender, EventArgs e)
    {
        if (!ListBox.Items.Contains(listBox1.SelectedItem)) // Random Idea which doesnt work
        {
        listBox2.Items.Add(listBox1.SelectedItem);
        }

    }