2009-11-04 45 views
5

我想在將項目添加到BindingList之前進行一些處理。我看到有一個ListChanged事件,但是在添加項目後觸發。 AddingNew事件僅在調用AddNew方法(不是Add方法)時觸發。有沒有人做過這樣的事情?如何在C#中將項目添加到集合之前觸發事件?

UPDATE:

我創建了以下類和當添加方法被調用IList中,我的新Add方法被觸發。那麼,我是否有在其他地方讀過的演員問題?如果我從集合中刪除了ISpecialCollection接口,我的Add方法不會被調用。有人可以解釋爲什麼它的行爲不同嗎?如果我使用ISpecialCollection接口,是否有鑄造問題?

public interface ISpecialCollection<T> : IList<T> 
{ 
} 

public class SpecialCollection<T> : BindingList<T>, ISpecialCollection<T> 
{ 
    public new void Add (T item) 
    { 
    base.Add(item);  
    } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
    IList<ItemType> list = new SpecialCollection<ItemType>(); 
    list.Add(new ItemType()); 
    } 
} 
+0

Jeff A.說在某些地方,價值被大量緩存,並且可能需要幾個小時才能更新。 – 2009-11-04 16:39:24

回答

3

應覆蓋保護BindingList.InsertItem方法(MSDN)。 Add,Insert等都稱此爲做實際添加添加並引發適當的事件。舉起你的活動,然後致電base.InsertItem完成剩下的事情。

1

喜歡的東西:

public class PreProcessBindingList<T> : Collection<T> 
    { 
     public AddingNewEventHandler AddingNew; 

     public override void Add(T item) 
     { 
      PreProcess(item); 
      base.Add(item); 

      AddingNewEventHandler addingNew = this.AddingNew; 
      if (addingNew != null) 
      { 
       addingNew(this, new AddingNewEventArgs(item)); 
      } 
     } 
    } 
+0

我知道,但我聽說如果有人將它轉換爲List並調用Add,可能會導致問題。在這種情況下,新的Add方法將不會被調用。 – bsh152s 2009-11-04 14:55:55

+0

是的,你想重寫它,而不是隱藏它。 – 2009-11-04 14:57:59

+0

您無法重寫BindingList.Add方法。你能做的最好的就是隱藏它。 – Ian 2009-11-04 15:02:40

2

我已經做了類似的事情,我需要捕捉ItemAdding和ItemAdded事件

神奇位是新的關鍵字,將覆蓋繼承的類方法

// class that inherits generic List and hides the add item 
public class ListWithEvents<T> : List<T> 
    { 
     public event EventHandler ItemAdding; 
     public event EventHandler ItemAdded; 

     public new void Add(T item) 
     { 
      if (ItemAdding != null) 
       ItemAdding(item, EventArgs.Empty); 

      base.Add(item); 

      if (ItemAdded != null) 
       ItemAdded(item, EventArgs.Empty); 

     } 
    } 

// Using the class 
protected override void OnLoad(EventArgs e) 
    { 

     ListWithEvents<int> lstI = new ListWithEvents<int>(); 
     lstI.ItemAdded += new EventHandler(lstI_ItemAdded); 
     lstI.ItemAdding += new EventHandler(lstI_ItemAdding); 
    } 

    void lstI_ItemAdding(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 

    void lstI_ItemAdded(object sender, EventArgs e) 
    { 
     throw new NotImplementedException(); 
    } 
3

最直接的路線是將Collection<T>類。這是BCL中的集合類,它是設計的被分類並使其行爲被覆蓋。對BindingList<T>List<T>等其他類型進行子類化只會導致你痛苦。

一旦你繼承Collection<T>,您可以覆蓋添加和創建自己的事件來聽。

0

做到這一點,正確的方法是延長Collection<T>並重寫InsertItem方法。在調用base.InsertItem之前,您可以在那裏引發您的事件。

0

使用C5集合庫。 C5的收藏已經設置爲能夠觸發多個操作的事件,包括清除收藏,添加項目,刪除項目,插入項目和一般收藏更改。

此外,C5庫集合在適當的地方實現了接口System.Collection.GenericIList,因此即使庫只是期望的,也可以將其放入實現中。一個SCG.ICollection

編輯:我忘了提及你的要求的一部分;很多我上面提到的這些事件是取消事件,而行動已經影響到了底層集合之前,可以讓你進行更改或拒絕添加,刪除等

-1

使用的ObservableCollection被解僱。它具有監視收藏何時發生變化的事件。我相信它主要用於WPF,但我也將它用於ASP.NET項目。

+1

... ObservableCollection(Of T)...在WindowsBase.dll的System.Collections.ObjectModel命名空間中。 – crazytmack 2010-01-17 04:20:53

+0

ObservableCollection僅包含帖子事件,但問題是關於預先事件。您將不得不從ObservableCollection繼承並重寫成員以獲取所需的行爲。 – 2012-05-01 01:29:56

相關問題