5

アイテムがBindingListに追加される前に、いくつかの処理を実行したいと思います。ListChangedイベントがあるようですが、これはアイテムが追加された後に発生します。AddingNewイベントは、AddNewメソッド(Addメソッドではない)が呼び出されたときにのみ発生します。誰かが以前にこのようなことをしたことがありますか?

アップデート:

次のクラスを作成しました。IListでAddメソッドが呼び出されると、新しいAddメソッドがトリガーされます。それで、私は他の場所で読んだキャストの問題がありますか?コレクションからISpecialCollectionインターフェイスを削除した場合、Addメソッドが呼び出されません。なぜそれが異なって動作しているのか誰かが説明できますか?ISpecialCollection <インターフェイスを使用すると、キャストの問題が発生しますか?

public interface ISpecialCollection<T> : IList<T>
{
}

public class SpecialCollection<T> : BindingList<T>, ISpecialCollection<T>
{
  public new void Add (T item)  
  {
    base.Add(item);    
  }
}

class Program
{
  static void Main(string[] args)
  {
    IList<ItemType> list = new SpecialCollection<ItemType>();
    list.Add(new ItemType());
  }
}
4

7 に答える 7

3

最も簡単な方法は、クラスをサブクラス化することCollection<T>です。これは、サブクラス化され、動作がオーバーライドされるように設計されたBCLのコレクションクラスです。BindingList<T>のような他のタイプをサブクラス化するList<T>と、痛みが発生します。

サブクラス化Collection<T>したら、Addをオーバーライドして、リッスンする独自のイベントを作成できます。

于 2009-11-04T15:53:21.747 に答える
3

保護されたBindingList.InsertItemメソッドをオーバーライドする必要があります(MSDN)。AddInsertおよびそのようなすべてがこれを呼び出して、実際の追加追加を実行し、適切なイベントを発生させます。イベントを開催してから、電話base.InsertItemで残りの作業を行ってください。

于 2009-11-04T16:02:22.783 に答える
2

ItemAddingおよびItemAddedイベントをキャプチャするために必要なのと同様のことを行いました

マジックビットは、継承されたクラスのメソッドをオーバーライドする新しいキーワードです

// class that inherits generic List and hides the add item
public class ListWithEvents<T> : List<T>
    {
        public event EventHandler ItemAdding;
        public event EventHandler ItemAdded;

        public new void Add(T item)
        {
            if (ItemAdding != null)
                ItemAdding(item, EventArgs.Empty);

            base.Add(item);

            if (ItemAdded != null)
                ItemAdded(item, EventArgs.Empty);

        }
    }

// Using the class
protected override void OnLoad(EventArgs e)
    {

        ListWithEvents<int> lstI = new ListWithEvents<int>();
        lstI.ItemAdded += new EventHandler(lstI_ItemAdded);
        lstI.ItemAdding += new EventHandler(lstI_ItemAdding);
    }

    void lstI_ItemAdding(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

    void lstI_ItemAdded(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
于 2009-11-04T15:52:33.660 に答える
1

何かのようなもの:

  public class PreProcessBindingList<T> : Collection<T>
    {   
        public AddingNewEventHandler AddingNew;

        public override void Add(T item)
        {
            PreProcess(item);
            base.Add(item);

            AddingNewEventHandler addingNew = this.AddingNew;
            if (addingNew != null)
            {
                addingNew(this, new AddingNewEventArgs(item));
            }
        }
    }
于 2009-11-04T14:53:03.360 に答える
0

これを行う正しい方法は、メソッドを拡張Collection<T>してオーバーライドするInsertItemことです。base.InsertItemを呼び出す前に、そこでイベントを発生させることができます。

于 2009-11-04T16:13:55.230 に答える
0

C5コレクションライブラリを使用します。C5のコレクションは、コレクションのクリア、アイテムの追加、アイテムの削除、アイテムの挿入、一般的なコレクションの変更など、いくつかの操作でイベントを発生させることができるようにすでに設定されています。

同様に、C5ライブラリコレクションは、必要に応じてSystem.Collection.Generic ICollectionandIListインターフェイスを実装するため、ライブラリが期待しているだけの場合でも、実装としてドロップインできますSCG.ICollection

編集:私はあなたの要件の一部に言及するのを忘れました。上記のイベントの多くはキャンセル可能なイベントであり、アクションが基になるコレクションに影響を与える前に発生するため、変更を加えたり、追加や削除などを拒否したりできます。

于 2009-11-05T17:33:44.487 に答える
-1

ObservableCollectionを使用します。コレクションがいつ変更されるかを監視するイベントがあります。これは主にWPFに使用されていると思いますが、ASP.NETプロジェクトでも使用しています。

于 2010-01-17T04:17:53.417 に答える