2011-03-08 54 views
0

我工作的WPF應用程序,我得到錯誤意味着我不能從ObservableCollectionClass我的代碼刪除項目..刪除記錄從的ObservableCollection類

它的工作給予波紋管,但該記錄不能刪除。

 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

錯誤你越來越? – Aliostad 2011-03-08 09:39:56

+0

不是錯誤,但我無法刪除此記錄。 – 2011-03-08 09:44:16

回答

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); 
     } 
    } 
1

ObservableCollection無法找到要刪除,因爲它是從當前集合中的一個不同的對象(你只是new創建它)。

您需要在您的UserDetail類重寫Equals使兩個實例可以平等基礎上的規則進行測試:

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(); 
} 
0

我認爲錯誤可能是'收集被修改;枚舉操作可能不會執行'。

這是使用可枚舉接口遍歷集合的foreach語句的問題。爲了克服這個問題,你可以製作一個當前集合[.ToList()方法]的淺表副本並遍歷每個集合。

的解決方案是:

的foreach(在Query.ToList VAR項目())
{
userDetail.Remove(項目);
}