2009-08-19 3 views
31

Ich habe eine Liste wie folgt aus:Wie behandelt man das Add-to-List-Event?

List<Controls> list = new List<Controls> 

Wie dieser Liste das Hinzufügen von neuen Position zu handhaben?

Wenn ich tun:

myObject.myList.Add(new Control()); 

Ich möchte so etwas wie dies in meinem Objekt tun:

myList.AddingEvent += HandleAddingEvent 

Und dann in meiner HandleAddingEvent Delegat Handhabung Hinzufügen Position zu dieser Liste. Wie soll ich mit dem Hinzufügen eines neuen Positionsereignisses umgehen? Wie kann ich diese Veranstaltung verfügbar machen?

+0

Verwenden Sie keine Blockquote. Wählen Sie den Text und drücken Sie Strg-K. –

Antwort

31

Sie könnten von List erben und Ihre eigenen Handler hinzufügen, so etwas wie

using System; 
using System.Collections.Generic; 

namespace test { 
    class Program { 

     class MyList<T> : List<T> { 

      public event EventHandler OnAdd; 

      public void Add(T item) { 
       if (null != OnAdd) { 
        OnAdd(this, null); 
       } 
       base.Add(item); 
      } 

     } 

     static void Main(string[] args) { 
      MyList<int> l = new MyList<int>(); 
      l.OnAdd += new EventHandler(l_OnAdd); 
      l.Add(1); 
     } 

     static void l_OnAdd(object sender, EventArgs e) { 
      Console.WriteLine("Element added..."); 
     } 
    } 
} 

Beachten Sie, dass Sie sollten auch AddRange erneut implementieren, Ihre eigenen Ereignistyp deklarieren, wenn Sie wissen wollen, was hinzugefügt wurde und So, das ist nur eine Grundidee ...

+1

Vielen Dank –

+32

Wäre nicht ObservableCollection dies bereits bereitstellen? – MattH

+3

MattH ist richtig, das wäre die bessere Lösung. BindingList wäre auch eine Lösung. http://msdn.microsoft.com/en-us/library/ms132742.aspx – shellscape

15

Sie können dies nicht mit List<T> tun. Sie können es jedoch mit ObservableCollection<T> tun. Siehe ObservableCollection<T> Class.

+0

Worin besteht der Unterschied bei der Verwendung von Liste oder Sammlung, wenn Sie diese noch ableiten müssen? Es gibt keine Ereignisse, die ausgelöst werden, wenn sich die Sammlung ändert. –

+0

Guter Fang. Ich weiß nicht, woran ich gedacht habe. Es ist 'ObservableCollection ', die die Ereignisse hat. –

+0

das ist richtig :) wir mussten etwas hervorheben. ObservableCollection und BindingList sind in .Net 4.0; Wenn Sie diese Spezialisierung in .Net 3.5 oder früher benötigen, müssen Sie List oder Collection ableiten und benutzerdefinierte Ereignisse hinzufügen. –

25

Was Sie brauchen, ist eine Klasse, die Ereignisse für jede Art von Änderung enthält, die in der Sammlung auftritt. Die beste Klasse dafür ist BindingList<T>. Es gibt Ereignisse für jede Art von Mutation, die Sie dann verwenden können, um Ihre Ereignisliste zu ändern.

+1

In meiner Erfahrung wurde 'AddingNew' -Ereignis nicht immer ausgelöst. 'ListChanged' Ereignis mit' e.ListChangedType == ListChangedType.ItemAdded' war robuster – Lu55

1

Sie können dies aus der Box mit Standard-Sammlungen nicht tun - sie unterstützen nur nicht Änderungsbenachrichtigungen. Sie könnten Ihre eigene Klasse erstellen, indem Sie einen vorhandenen Sammlungstyp erben oder aggregieren, oder Sie könnten BindingList<T> verwenden, das IBindingList implementiert und Änderungsbenachrichtigungen über das Ereignis ListChanged unterstützt.

+1

Das ist falsch, wie die anderen Antworten sagen, die ObservableCollection kann es tun. –

51

Ich glaube, was Sie suchen, ist bereits Teil der API in der ObservableCollection(T) Klasse. Beispiel:

+1

ObservableCollection sieht wie der richtige Weg aus, dies zu erreichen. – yarg

2

Eine einfache Lösung besteht darin, eine Add-Methode für die Liste in Ihrem Projekt einzuführen und das Ereignis dort zu behandeln. Es erfüllt nicht die Notwendigkeit eines Event-Handlers, kann aber für einige kleine Projekte nützlich sein.

AddToList(item) // or 
AddTo(list,item) 
//////////////////////// 

void AddTo(list,item) 
{ 
    list.Add(item); 
    // event handling 
} 

statt

list.Add(item); 
0

Um Huckepack-off Ahmad Verwendung von Erweiterungsmethoden, können Sie Ihre eigene Klasse erstellen, in dem die Liste mit einer öffentlichen get Methode privat ist und eine öffentliche add Methode .

public class MyList 
{ 
    private List<SomeClass> PrivateSomeClassList; 
    public List<SomeClass> SomeClassList 
    { 
     get 
     { 
      return PrivateSomeClassList; 
     } 
    } 

    public void Add(SomeClass obj) 
    { 
     // do whatever you want 
     PrivateSomeClassList.Add(obj); 
    } 
} 

jedoch diese Klasse bietet nur Zugriff auf List<> Methoden, die Sie manuell belichten ... daher nicht nützlich sein kann in Fällen, in denen Sie viele dieser Funktionen benötigen.

0

Keine Notwendigkeit, ein Ereignis hinzuzufügen, fügen Sie einfach die Methode hinzu.

public class mylist:List<string> 
{ 
    public void Add(string p) 
    { 
    // Do cool stuff here 
    base.Add(p); 
    } 
} 
Verwandte Themen