Как обработать, добавляют к событию списка?

Хотя эта функция не помогает помешать Вам повреждать вещи, она определенно помогает наложить вина , кто повредил ее.

, Но здесь некоторые основные функции, что справка препятствует тому, чтобы Вы повредили вещи.

Наконец, слияние и ветвление являются, вероятно, одной из самой мощной команды.

40
задан Adam Plocher 23 July 2014 в 11:30
поделиться

5 ответов

Вы можете унаследовать от List и добавить свой собственный обработчик, что-то вроде

using System;
using System.Collections.Generic;

namespace test
{
    class Program
    {

        class MyList<T> : List<T>
        {

            public event EventHandler OnAdd;

            public new void Add(T item) // "new" to avoid compiler-warnings, because we're hiding a method from base-class
            {
                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...");
        }
    }
}

Warning

  1. Имейте в виду, что вам нужно повторно реализовать все методы, которые добавляют объекты в ваш список. AddRange () не будет запускать это событие в этой реализации.

  2. Мы не перегружали метод. Мы спрятали оригинал. Если вы Add () объект, когда этот класс заключен в List , событие не будет запущено !

MyList<int> l = new MyList<int>();
l.OnAdd += new EventHandler(l_OnAdd);
l.Add(1); // Will work

List<int> baseList = l;
baseList.Add(2); // Will NOT work!!!
40
ответ дан 27 November 2019 в 01:02
поделиться

Что вам нужно, так это класс, у которого есть события для любого типа модификации, которая происходит в коллекции. Лучшим классом для этого является BindingList . В нем есть события для каждого типа мутации, которые затем можно использовать для изменения списка событий.

26
ответ дан 27 November 2019 в 01:02
поделиться

Я считаю, что то, что вы ищете, уже является частью API в классе ObservableCollection (T) . Пример:

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);
66
ответ дан 27 November 2019 в 01:02
поделиться

Вы не можете сделать это с помощью List . Однако вы можете сделать это с помощью ObservableCollection . См. ObservableCollection Класс .

16
ответ дан 27 November 2019 в 01:02
поделиться

Вы не можете сделать это со стандартными коллекциями из коробки - они просто не поддерживают уведомления об изменениях. Вы можете создать свой собственный класс путем наследования или агрегирования существующего типа коллекции или использовать BindingList , который реализует IBindingList и поддерживает уведомления об изменениях через ListChanged событие.

1
ответ дан 27 November 2019 в 01:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: