Что может привести к тому, что listBox.Items.Remove удалит не тот элемент? - PullRequest
1 голос
/ 11 января 2011

Дерьмо. Я нашел проблему. Не берите в голову. Когда элемент был удален, он должен был быть заменен другим элементом, но до того, как замена могла произойти, было инициировано событие, которое удалило неправильный элемент, поскольку замена еще не произошла. В обоих случаях утверждения не выполняются:

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 ]

2 голосов
/ 11 января 2011

Элементы ListBox являются пользовательскими классами.

Если вы переопределили методы GetHashCode и Equals, тогда при удалении может оказаться, что item4 и item5 действительно совпадают, и, таким образом, удалит item4 вместо item5, поскольку он находит первый.

Попробуйте сделать это дважды. Если оба элемента удалены, то это, скорее всего, так. Также попробуйте установить item4.Equals (item5) вместо item4 == item5.

0 голосов
/ 11 января 2011

Когда вы удаляете элемент из списка, список переиндексируется.Элемент [6] становится элементом [5].

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...