从ObservableCollection类中删除记录

时间:2011-03-08 09:30:14

标签: wpf linq observablecollection

我正在使用WPF应用程序,我收到错误意味着我无法从ObservableCollectionClass中删除项目我的代码如下所示......

它正在运行,但记录不是删除。

        SampleDB conn = new SampleDB(Helper.GetPath());

        var Query = from a in conn.UserInfo
                    where a.ID == (int)iSelectedID
                    select new UserDatail { ID = a.ID, Name = a.Name, Address = a.Address, City = a.City, Pin = a.Pin, Phone = a.Phone };

        foreach (var item in Query)
        {
            userDetail.Remove(item);

        }
        dgPorfomance.ItemsSource = userDetail;
        dgPorfomance.Items.Refresh();

3 个答案:

答案 0 :(得分:1)

ObservableCollection无法找到您要删除的对象,因为它与当前集合中的对象不同(您只是使用new创建了它。)

您需要覆盖Equals类中的UserDetail,以便根据您的规则测试两个实例的相等性:

public override bool Equals(object o)
{
    UserDetail other = o as UserDetail;
    if (other != null)
    {
        return this.Id == other.Id;
    }
    return false;
}

请注意,当您覆盖Equals时,您还必须覆盖GetHashCode

public override int GetHashCode()
{
    return this.Id.GetHashCode();
}

答案 1 :(得分:0)

您正试图从一开始就不包含此对象的集合中删除对象。

说明:

当你做

foreach (var item in Query)
    {
        userDetail.Remove(item);
    }

您必须确保循环中的每个项目都与集合中包含的项目相同。在这里,情况并非如此:项目可能看起来是相同的,但它们实际上是同一项目的2个不同实例,因为您首先从查询而不是从您的集合中获取这些项目

所以在这种情况下你应该这样做:

foreach (var item in Query)
    {
        foreach (var itemInCollection in userDetail)
        {
             if (itemInCollection.Id == item.Id)
                 userDetail.Remove(itemInCollection );
        }
    }

答案 2 :(得分:0)

我认为错误可能是'收藏被修改;枚举操作可能不会执行'。

这是foreach语句的问题,带有ienumerable接口来遍历集合。为了解决这个问题,你可以对当前集合[.ToList()方法]进行浅层复制,并遍历每个集合。

解决方案是:

foreach(Query.ToList()中的var项目)
        {
            userDetail.Remove(项目);
        }