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]);
}
}
答案 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
方法。但是,您可能错过了一个关键点。
您使用哪种类型的项目来填充ListBox
? Exists
会调用.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);
}
}