Получение индекса удаленного элемента из списка связывания - PullRequest
4 голосов
/ 07 августа 2009

Я могу получить индекс элементов, добавленных в 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

РЕДАКТИРОВАТЬ: ответы на C # также приветствуются .... кто-нибудь?

Ответы [ 2 ]

10 голосов
/ 21 февраля 2010

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

Однако вы можете наследовать от 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 действительно удаляет элемент.

0 голосов
/ 11 августа 2009

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

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

...