2009-08-19 13 views
31

que tienen una lista como esta:¿Cómo manejar el evento agregar a la lista?

List<Controls> list = new List<Controls> 

Cómo manejar la adición de nueva posición en esta lista?

Cuando hago:

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

me gustaría hacer algo como esto en mi objeto:

myList.AddingEvent += HandleAddingEvent 

Y luego, en mi posición añadiendo HandleAddingEvent manejo delegado a esta lista. ¿Cómo debo manejar agregar un nuevo evento de posición? ¿Cómo puedo hacer que este evento esté disponible?

+0

No utilice blockquote. Seleccione el texto y presione Control-K. –

Respuesta

31

Se puede heredar de la lista y añadir su propio controlador, algo así como

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..."); 
     } 
    } 
} 

Tenga en cuenta que también debe volver a aplicar AddRange, declare su propio tipo de evento, si usted quiere saber lo que se ha añadido y etc., esta es solo una idea básica ...

+1

Muchas gracias –

+32

¿No lo hubiera observado ObservableCollection ? – MattH

+3

MattH es correcto, esa sería la mejor solución. BindingList también sería una solución. http://msdn.microsoft.com/en-us/library/ms132742.aspx – shellscape

15

No puede hacer esto con List<T>. Sin embargo, puede hacerlo con ObservableCollection<T>. Ver ObservableCollection<T> Class.

+0

¿Cuál es la diferencia usando List o Collection si aún necesita derivarlo? No hay ningún evento que se presente cuando cambie la colección. –

+0

Buena captura. No sé en qué estaba pensando. Es 'ObservableCollection ' que tiene los eventos. –

+0

eso es correcto :) tuvimos que señalar algo. ObservableCollection y BindingList están en .Net 4.0; por lo tanto, si necesita esta especialidad en .Net 3.5 o antes, debe derivar Lista o Colección y agregar eventos personalizados. –

25

Lo que necesita es una clase que tenga eventos para cualquier tipo de modificación que ocurra en la colección. La mejor clase para esto es BindingList<T>. Tiene eventos para cada tipo de mutación que luego puede usar para modificar su lista de eventos.

+1

En mi experiencia, el evento 'AddingNew' no siempre se activaba. El evento 'ListChanged' con' e.ListChangedType == ListChangedType.ItemAdded' fue más robusto – Lu55

1

No se puede hacer esto con colecciones estándar fuera de la caja - que simplemente no son compatibles con las notificaciones de cambio. Puede construir su propia clase heredando o agregando un tipo de colección existente o puede usar BindingList<T> que implementa IBindingList y admite notificaciones de cambio a través del evento ListChanged.

+1

Eso está mal, como dicen las otras respuestas, el ObservableCollection puede hacerlo. –

51

Creo que lo que estás buscando ya es parte de la API en la clase ObservableCollection(T). Ejemplo:

ObservableCollection<int> myList = new ObservableCollection<int>(); 

myList.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(
    delegate(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)      
    { 
     if (e.Action == System.Collections.Specialized.NotifyCollectionChangedAction.Add) 
     { 
      MessageBox.Show("Added value"); 
     } 
    } 
); 

myList.Add(1); 
+1

ObservableCollection parece la forma correcta de lograr esto. – yarg

2

Una solución sencilla es introducir un método Add de la lista en su proyecto y controlar el evento allí. No responde a la necesidad de un controlador de eventos, pero puede ser útil para algunos proyectos pequeños.

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

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

en lugar de

list.Add(item); 
0

Para el de lengüeta fuera de uso de Ahmad de métodos de extensión, puede crear su propia clase, donde la lista es privada con una get método público y un método público add .

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); 
    } 
} 

Sin embargo, esta clase sólo proporciona acceso a List<> métodos que exponga de forma manual ... por lo tanto puede no ser útil en casos donde se necesita una gran cantidad de esa funcionalidad.

0

No es necesario agregar un evento solo agregue el método.

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