1

これを行うことにより、DataGridViewにバインドされているBindingListからオブジェクトを削除しようとしています...

private void RemoveItems(List<Payment> removeList)
{
    for (int i = removeList.Count - 1; i >= 0; i--)
    {
    sortableBindingPaymentList.Remove(removeList[i]);
    }
}

これを自分でデバッグしようとすると、次のことを試みましたが、removerは常に= -1(一致するものが見つからなかったことを意味します)であり、removeList内のPaymentのリストにsortableBindingList内の一致が含まれていると110%確信しています...

private void RemoveItems(List<Payment> removeList)
{
    int remover;

    for (int i = removeList.Count - 1; i >= 0; i--)
    {
        remover = sortableBindingPaymentList.IndexOf(removerList[i]);
        sortableBindingPaymentList.RemoveAt(remover);
    }
}

どんな助けでもありがたいです、そして前もって感謝します!

4

2 に答える 2

1

removeListにsortableBindingPaymentListの参照と同じ参照(同じオブジェクト)が含まれていない場合、メソッドは-1を返します。これは、あなたの場合に発生すると思います。

ここに、リストの「削除」メソッドが記載されています。

「このメソッドは、リスト内の値のタイプであるTのデフォルトの等式比較子EqualityComparer.Defaultを使用して等式を判別します。」

支払いクラスはIEquatableインターフェースを実装する必要があります。

例えば:

     public class Payment : IEquatable 
     {
        public  bool Equals(Payment paymentObj)
             {
                 //is current instance equal to payment OBJ?
                 //if yes, then return true otherwise false
             }
      }

これで、リストコレクションにオブジェクトのインスタンスが異なる場合でも、この呼び出しは機能するはずです。

      sortableBindingPaymentList.Remove(removeList[i]);

さらにサポートが必要な場合は、完全な投稿を投稿してください。

于 2013-02-04T22:27:12.673 に答える
1

うまくいくかどうかIEquatableはわかりません。使用しているORMによっては、問題が発生する可能性があります。

あなたのエンティティは主キーを持っていますか?代わりにこれを試すことができます:

private void RemoveItems(List<Payment> removeList)
{
    removeList.ForEach(x => sortableBindingPaymentList.RemoveAll(s => s.Id == x.Id));
}

forPS:ループの代わりに、この種の操作にLinQの使用を開始することを強くお勧めします。

于 2013-02-04T22:36:58.087 に答える