Как я могу запустить событие, прежде чем объект будет добавлен к набору в C#?

this на компиляторе C++

компилятор C++ будет тихо поиск для символа, если это сразу не найдет его. Иногда, большую часть времени, это хорошо:

  • использование метода родительского класса, если Вы не сделали, перегрузило его в дочернем классе.
  • продвижение значения типа в другой тип

, Но иногда, Вы просто не хотите, чтобы компилятор предположил. Вы хотите компилятор к погрузке правильный символ и не другой.

Для меня , те времена - когда в рамках метода я хочу получить доступ к членскому методу или членской переменной. Я просто не хочу некоторый случайный символ, взятый просто, потому что я записал printf вместо print. this->printf не скомпилировал бы.

Дело в том, что, с библиотеками прежней версии C (В§), унаследованный код несколько записанных годы назад (§§), или независимо от того, что могло произойти на языке, где копия/вставка является устаревшей, но все еще активной функцией, иногда, говоря компилятору не играть остроумие, является прекрасной идеей.

Это причины, которые я использую this.

(В§) это - все еще своего рода тайна мне, но я теперь задаюсь вопросом, включаете ли факт Вы < окна h> заголовок в Вашем источнике, причина, все символы библиотек C прежней версии загрязнят Ваше глобальное пространство имен

(§§), понимая, что "необходимо включать заголовок, но который включая этот заголовок повредит код, потому что это использует некоторый немой макрос с родовым названием", один из тех русская рулетка моменты жизни кодера

5
задан bsh152s 4 November 2009 в 15:23
поделиться

7 ответов

Следует переопределить защищенный метод BindingList.InsertItem ( MSDN ). Добавить , Вставить и все это вызывает это для фактического добавления и создания соответствующих событий. Поднимите свое событие, а затем вызовите base.InsertItem , чтобы сделать все остальное.

3
ответ дан 14 December 2019 в 04:41
поделиться

I have done something similar as I needed to capture the ItemAdding and ItemAdded event

The magic bit is the new keyword that will override the inherited class' method

// 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();
    }
2
ответ дан 14 December 2019 в 04:41
поделиться

Самый простой путь - создать подкласс класса Collection . Это класс коллекции в BCL, разработанный для создания подклассов и переопределения его поведения. Создание подкласса других типов, таких как BindingList или List , только вызовет у вас боль.

После создания подкласса Collection вы можете переопределить Добавить и создать собственное событие для прослушивания.

3
ответ дан 14 December 2019 в 04:41
поделиться

Что-то вроде:

  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));
            }
        }
    }
1
ответ дан 14 December 2019 в 04:41
поделиться

Правильный способ сделать это - расширить Collection и переопределить метод InsertItem . Вы можете вызвать свое событие там перед вызовом base.InsertItem.

0
ответ дан 14 December 2019 в 04:41
поделиться

Используйте библиотеку коллекций C5 . Коллекции C5 уже настроены, чтобы иметь возможность запускать события для нескольких операций, включая очистку коллекции, добавление элементов, удаление элементов, вставку элементов и общие изменения коллекции.

Также, коллекции библиотеки C5 реализуют интерфейсы System.Collection.Generic ICollection и IList там, где это необходимо, и поэтому могут быть исключены в качестве реализации, даже если библиотека только ожидает, например, SCG.ICollection .

РЕДАКТИРОВАТЬ: Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д.

Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д.

Я забыл упомянуть часть ваших требований; многие из упомянутых выше событий являются отменяемыми и запускаются до того, как действие повлияет на базовую коллекцию, что позволяет вносить изменения или отклонять добавления, удаления и т. д.

0
ответ дан 14 December 2019 в 04:41
поделиться

Используйте Наблюдаемый сбор. В ней есть события, которые отслеживаются при изменении коллекции. Я считаю, что в первую очередь она используется для WPF, но я использовал ее и в проектах ASP.NET.

-1
ответ дан 14 December 2019 в 04:41
поделиться
Другие вопросы по тегам:

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