2016-04-19 12 views
0

私はカートと呼ばれるクラスの静的配列リストを持っていますが、他のクラスで使用するイベントリスナーを実装する方法はありますか? 私はC#を初めて使ってPropertyChangedEventHandlerを理解しようとしましたが、成功しませんでした。 のArrayListとプロパティは以下のように初期化されていますC#静的Arraylist数が変更されたときにイベントをトリガする方法は?

private static ArrayList cartList = new ArrayList(); 

    public static ArrayList CartList 
    { 
     get { return cartList; } 
     set 
     { 
      cartList = value; 
     } 
    } 

編集:基本メソッドを非表示にすることで、リストで動作するように

変化した@KMCコード:

public class ListOfProducts : List<Product> 
{ 

    public void Add(Product obj) 
    { 
     base.Add(obj); 
     this.OnChange(); 
    } 

    public void UpdateLast(Product obj) 
    { 
     base[base.Count - 1] = obj; 
     this.OnChange(); 
    } 
    public void Remove(Product obj) 
    { 
     base.Remove(obj); 
     this.OnChange(); 
    } 

    public void Clear() 
    { 
     base.Clear(); 
     this.OnChange(); 
    } 

    public event EventHandler Change; 

    protected void OnChange() 
    { 
     if (this.Change != null) 
     { 
      this.Change(this, new EventArgs() { }); 
     } 
    } 
} 
+1

INotifyPropertyを実装して変更できます。 http://stackoverflow.com/questions/1315621/implementing-inotifypropertychanged-does-a-better-way-exist –

+2

詳細を教えてください。 ArrayList自体またはそのリストに含まれる各項目に関連するイベントを受け取ってもよろしいですか? –

+0

補足として:ArrayListの使用を控えてください。代わりにリストを使用してください。どうして? ArrayListはリストの古い非総称的な方法であり、すべての項目を 'オブジェクト'として保存するためです。リストは、キャストする必要がないように、すべてのアイテムをCartオブジェクトとして保存します。より便利でより良いパフォーマンス。 – Measuring

答えて

2

ArrayListタイプは拡張可能です。追加と削除のメソッドをオーバーライドしてイベントを発生させることができます。 EX用

)ArrayListのメッセージ(イベント)のいくつかのタイプを送信する必要があると私はそれを受信します誰かわからないので、

public class NewArrayList : ArrayList 
{ 
    public event EventHandler Change; 

    public override int Add(object value) 
    { 
     var result = base.Add(value); 
     this.OnChange(); 
     return result; 
    } 

    public override void Remove(object obj) 
    { 
     base.Remove(obj); 
     this.OnChange(); 
    } 

    protected void OnChange() 
    { 
     if (this.Change != null) 
     { 
      this.Change(this, new EventArgs() { }); 
     } 
    } 
} 
public static class program 
{ 
    static void Main(string[] args) 
    { 

     var list = new NewArrayList(); 
     list.Change += delegate (object sender, EventArgs arg) { 
      Console.WriteLine("collect changed {0}", list.Count); 
     }; 

     list.Add(1); 
     list.Add(2); 
     list.Remove(2); 

    } 

} 

、私はあなたにそれを残しておきます。

+0

この年齢でArrayListを使用することは本当にお勧めできません。少なくとも、新しいコードでは他の人が使うつもりはない。 – Measuring

+1

リストに切り替わりますが、これは私が感謝のために探していたロジックです。 –

2

あなたは時に通知を受けることができませんArrayListの要素数が変化したり、要素が変更されたりすることはありません。アイテムの通知を提供していない(WPFでObservableCollectionのような専用のクラスを除く)List<T>Dictionaryや配列などの.NET Frameworkの

ArrayListと他のほとんどの標準的なコレクションを追加/削除します。対応するクラスのMSDNエントリを調べて、それがINotifyCollectionChangedおよび/またはINotifyPropertyChangedを実装しているかどうかを簡単に確認できます。私。 ArrayListIList, ICollection, IEnumerable, ICloneableを実装し、通知インターフェイスは実装していません。

このような変更の通知が必要な場合は、そのような通知で独自のクラスを作成するか、ObservableCollectionを使用する必要があります。

サイドノート:非汎用のArrayList - ArrayList vs List<> in C#の代わりにList<T>を使用してください。

関連する問題