2009-08-07 6 views
4

Я могу получить индекс элементов, добавленных в BindingList. Когда я пытаюсь получить индекс, если удаленный элемент я получаю ошибкуПолучение индекса удаляемого элемента из списка привязки

Index was out of range. Must be non-negative and less than the size of the collection. Parameter name: index 

Вот мой код

Private Sub cmdRemove_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdRemove.Click 

    For i As Integer = 0 To _assignedSelection.SelectedCount - 1 
     Dim item As Jurisdiction = CType(_assignedSelection.GetSelectedRow(i), Jurisdiction) 
     _list.Remove(item) 
    Next 

End Sub 


Private Sub list_Change(ByVal sender As Object, ByVal e As ListChangedEventArgs) Handles _list.ListChanged 

    If (_list.Count > 0) Then 


     Select Case e.ListChangedType 
      Case ListChangedType.ItemAdded 
       _dal.InsertJurisdiction(_list.Item(e.NewIndex)) 
      Case ListChangedType.ItemDeleted 
       'MsgBox(e.NewIndex.ToString) 
       _dal.DeleteJurisdiction(_list.Item(e.NewIndex)) <--------HERE 
     End Select 

    End If 

End Sub 

EDIT: Ответы в C# также приветствуются .... кто-нибудь?

ответ

10

Элемент удален до Событие пожаров. Это означает, что (без дополнительного кода) вы не можете добраться до удаляемого элемента.

Вы можете, однако, наследовать от BindingList, и переопределить RemoveItem:

public class BindingListWithRemoving<T> : BindingList<T> 
{ 
    protected override void RemoveItem(int index) 
    { 
     if (BeforeRemove != null) 
      BeforeRemove(this, 
        new ListChangedEventArgs(ListChangedType.ItemDeleted, index)); 

     base.RemoveItem(index); 
    } 

    public event EventHandler<ListChangedEventArgs> BeforeRemove; 
} 

Вы должны также повторить BindingList конструкторов. Кроме того, не пытайтесь сделать его отмененным, так как вызывающие могут предположить, что вызов Remove действительно удаляет элемент.

+1

Это документированная ошибка с несколькими обходными решениями (например, любезно предоставленные peterchen)! http://connect.microsoft.com/VisualStudio/feedback/details/148506/listchangedtype-itemdeleted-is-useless-because-listchangedeventargs-newindex-is-already-gone – Harrison

+0

@Harrison: спасибо за подключение! – peterchen

+0

Основная цель этого мероприятия - передать управление пользовательским интерфейсом, какую позицию они должны удалить. –

0

Я немного смущен формулировкой вашего вопроса. Однако элемент больше не индексируется, если он был удален.

Если вам нужен индекс, в котором находился элемент до того, как он был удален, возможно, сохранение статической переменной, например Private Shared removedIndex As Integer, и установка этого параметра перед удалением элемента даст вам то, что вы хотите?

+0

не должно ли событие ListChanged указывать индекс измененного элемента в списке привязки? –

+0

Он делает - но после факта, см. Мой ответ. – peterchen

Смежные вопросы