什么可能导致listBox.Items.Remove删除错误的项目?

时间:2011-01-11 14:35:46

标签: c# .net listbox

垃圾。我发现了这个问题。没关系。当项目被移除时,它应该被替换为另一个项目,但在替换之前可能会发生一个事件,由于尚未进行替换,因此触发了删除错误项目的事件。

两种方式,断言都失败了:

var item4 = listBox.Items[4];
var item5 = listBox.Items[5];

listBox.Items.Remove(item5);

Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");

var item4 = listBox.Items[4];
var item5 = listBox.Items[5];

listBox.Items.RemoveAt(5);

Debug.Assert(listBox.Items.Contains(item4), "item4 not found");
Debug.Assert(!listBox.Items.Contains(item5), "item5 still found");

ListBox项是自定义类。 ListBox是所有者绘制的。

断言item4 != item5通过。

2 个答案:

答案 0 :(得分:2)

  

ListBox项目是自定义类。

如果你覆盖了GetHashCode和Equals方法,那么Remove可能会发现item4和item5确实相同,因此删除item4而不是item5,因为这是它找到的第一个。

尝试两次。如果两个项目都被删除,那么很可能就是这种情况。同时尝试断言item4.Equals(item5)而不是item4 == item5。

答案 1 :(得分:0)

从列表框中删除项目时,会重新编制列表框索引。项目[6]成为项目[5]。

http://msdn.microsoft.com/en-us/library/system.windows.forms.listbox.objectcollection.remove(VS.71).aspx