我能够获得添加到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#中的答案也欢迎......任何人?
答案 0 :(得分: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 :(得分:0)
我对你问题的措辞有点困惑。但是,如果项目已被删除,则不再对该项目编制索引。
如果您需要项目在删除之前所处的索引,可能存储静态变量(例如Private Shared removedIndex As Integer
并在删除项目之前设置该变量)会为您提供所需的内容吗?