我正在使用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();
答案 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(项目);
}