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 に答える