dotnet: ListChangedType.ItemDeleted бесполезен? - PullRequest
5 голосов
/ 17 ноября 2008

Событие ListChanged для IBindingList запускает тип ListChangedType.ItemDeleted при удалении элементов, возможно, пользователем, удаляющим строку в элементе управления сеткой данных, привязанном к списку. Проблема в том, что NewIndex в списке недопустим в этом событии, он был удален, а удаленный элемент недоступен. Должно быть событие ItemDeleting, но я сомневаюсь, что они когда-нибудь это исправят.

Ответы [ 4 ]

8 голосов
/ 24 января 2010

Да, это довольно раздражает, но есть простой обходной путь. Я создаю класс BindingListBase<T>, который я использую для всех своих списков вместо обычного BindingList<T>. Поскольку мой класс наследуется от BindingList<T>, у меня есть доступ ко всем его защищенным членам, включая метод RemovedItem.

Это позволяет мне забрать при удалении предмета. Вы можете сделать то, что я делаю, и иметь список mRemovedItems, в который я всегда добавляю элементы, или вызвать ваше собственное событие ItemRemoved.

См. Мой пример кода ниже:

Public MustInherit Class BindingListBase(Of T)
    Inherits BindingList(Of T)

    Protected mRemovedItems As New List(Of T)

    Protected Overrides Sub ClearItems()
        MyBase.ClearItems()
        mRemovedItems.Clear()
    End Sub

    Protected Overrides Sub RemoveItem(ByVal index As Integer)
        Dim item As T = MyBase.Item(index)

        MyBase.RemoveItem(index)

        mRemovedItems.Add(item)
    End Sub

    Public ReadOnly Property RemovedItems as List(Of T)
        Get
            Return mRemovedItems
        End Get
    End Property
End Class
2 голосов
/ 19 февраля 2014

Вот моя версия класса BindingList, который реализует событие ItemRemoved вместо хранения вторичного списка удаленных элементов

public class ItemRemovedEventArgs : EventArgs
{
    public Object Item { get; set; }

    public ItemRemovedEventArgs(Object item)
    {
        this.Item = item;
    }
}

public delegate void ItemRmoveEventHandler(Object sender, ItemRemovedEventArgs e);

public class BindingListRedux<T> : BindingList<T>
{
    public BindingListRedux() : base() { }

    public BindingListRedux(IList<T> list) : base(list) { }

    public event ItemRmoveEventHandler ItemRemoved;

    protected void OnItemRemoved(ItemRemovedEventArgs e)
    {
        if (ItemRemoved != null)
        {
            ItemRemoved(this, e);
        }
    }

    protected override void RemoveItem(int index)
    {
        Object item = base[index];
        base.RemoveItem(index);
        this.OnItemRemoved(new ItemRemovedEventArgs(item));
    }
}
2 голосов
/ 17 ноября 2008

Это на самом деле не предназначено для этой цели. NewIndex - это индекс, где был элемент, когда он был удален, и для связанных элементов управления полезно иметь возможность найти связанный с ним отображаемый элемент в своих списках и удалить его.

Какой вариант использования вы хотите включить с ItemDeleting?

1 голос
/ 06 февраля 2013

Я сделал нечто похожее на то, что сделал Адам Вальпид, то есть реализовал свой собственный класс с помощью обработчика событий ListChanging. Это позволяет мне работать с элементом, который собирается удалить из списка, прежде чем он на самом деле.

В ответ на вопрос Sunlight относительно варианта использования ... среди прочего, я использую его для удаления обработчиков событий, которые были помещены в содержащийся элемент, когда он был добавлен в список. Мои элементы данных содержат уровень серьезности ошибок, определенный во время проверки, и элементы графического интерфейса, которые они должны отображать эту серьезность ошибок в качестве цвета фона. Когда уровень серьезности ошибок элемента данных изменяется, элемент GUI должен быть обновлен. Поэтому я должен поместить обработчик события HighestSeverityChanged в элемент данных, когда он отображается (либо сам по себе, либо как часть отображаемого списка), и мне нужно удалить этот обработчик событий, когда элемент GUI не связан с данных элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...