2009-08-07 2 views
4

BindingListに追加されたアイテムのインデックスを取得できました。私が削除された項目場合はインデックスを取得しようとすると、私はエラーを取得する削除したアイテムのインデックスをバインディングリストから取得する

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

ここに私のコードは、EDIT

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#での回答が....誰にも歓迎されていますか?

答えて

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

@ハリソン:接続リンクに感謝! – peterchen

+0

このイベントの主な目的は、削除すべき位置のUIコントロールを通知することです。 –

0

質問の文句と少し混乱しています。ただし、削除されたアイテムは索引付けされなくなります。

アイテムが削除される前のインデックスが必要な場合は、おそらくPrivate Shared removedIndex As Integerなどの静的変数を保存してアイテムを削除する前に設定すると、必要なものが得られますか?

+0

ListChangedイベントは、変更された項目のインデックスをバインディングリストに与えるべきではありませんか? –

+0

それはします - しかし、事実の後、私の返事を参照してください。 – peterchen

関連する問題