当删除项时,IBindingList的ListChanged事件会触发类型ListChangedType.ItemDeleted,可能是用户删除绑定到列表的数据网格控件中的行。问题是列表中的NewIndex在此事件中无效,已被删除,并且已删除的项目不可用。应该有一个ItemDeleting事件,但我怀疑他们会解决这个问题。
答案 0 :(得分:8)
是的,它很烦人,但有一个简单的解决方法。我创建了一个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
答案 1 :(得分:2)
它并非真正用于此目的。 NewIndex
是项目被删除时的索引,绑定控件能够在自己的列表中找到关联的显示项并将其删除。
您要使用ItemDeleting
启用的用例是什么?
答案 2 :(得分:2)
这是我的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));
}
}
答案 3 :(得分:1)
我做了类似于Adam Valpied所做的事情,即使用ListChanging事件处理程序实现了我自己的类。这让我可以使用即将从列表中删除的项目。
响应Sunlight关于用例的问题......除其他事项外,我使用它来删除放入列表时放在包含项目上的事件处理程序。我的数据元素包含在验证期间确定的错误严重性级别,以及它们必须将错误严重性显示为背景颜色的GUI元素。当数据元素的错误严重性级别更改时,必须更新GUI元素。所以我必须在数据元素显示时放置一个HighestSeverityChanged事件处理程序(无论是单独还是作为正在显示的列表的一部分),我需要在GUI元素未绑定时删除该事件处理程序。数据元素。