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

编辑:也欢迎 C# 中的答案....有人吗?

4

2 回答 2

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确实删除了该项目。

于 2010-02-21T14:54:05.397 回答
0

我对你问题的措辞有点困惑。但是,如果项目已被删除,则不再对其编制索引。

如果您需要该项目在删除之前所在的索引,也许存储一个静态变量,例如Private Shared removedIndex As Integer并在删除该项目之前设置它,会给您想要的吗?

于 2009-08-11T12:11:25.413 回答