2009-11-04 9 views
5

Vorrei eseguire alcune elaborazioni prima che un elemento venga aggiunto a BindingList. Vedo che c'è un evento ListChanged ma questo viene attivato dopo l'aggiunta dell'elemento. L'evento AddingNew viene attivato solo quando viene chiamato il metodo AddNew (non il metodo Add). Qualcuno ha mai fatto qualcosa del genere?Come posso attivare un evento prima che l'elemento venga aggiunto alla raccolta in C#?

UPDATE:

ho creato le seguenti classi e quando il metodo Add viene chiamato sul IList, il mio nuovo metodo Add viene attivato. Quindi, ho il problema del casting che ho letto in altri posti? Se ho rimosso l'interfaccia ISpecialCollection dalla raccolta, il mio metodo Add non viene chiamato. Qualcuno può spiegare perché sta agendo in modo diverso? Ho un problema di trasmissione se utilizzo l'interfaccia 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.dice da qualche parte che il valore è pesantemente memorizzato nella cache e che possono essere necessarie un paio d'ore per essere aggiornati. –

risposta

3

È necessario eseguire l'override del metodo protetto BindingList.InsertItem (MSDN). Add, Insert e tutto questo viene chiamato per aggiungere e aggiungere eventi appropriati. Aumenta il tuo evento, quindi chiama base.InsertItem per fare il resto.

1

Qualcosa di simile:

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

Lo so ma ho sentito che questo potrebbe causare problemi se qualcuno lo lancia come una lista e chiama Aggiungi. In tal caso, il nuovo metodo Aggiungi non verrà chiamato. – bsh152s

+0

Sì, dovresti sostituirlo, non nasconderlo. –

+0

Non è possibile sovrascrivere il metodo BindingList.Add. Il meglio che puoi fare è nasconderlo. – Ian

2

ho fatto qualcosa di simile come ho bisogno di catturare l'ItemAdding e ItemAdded evento

Il bit magia è la nuova parola chiave che sostituirà la classe ereditata metodo

3

Il percorso più semplice è quello di sottoclasse delloClasse. Questa è la classe di raccolta nel BCL che è progettata in per essere sottoclasse e avere il suo comportamento annullato. Sottoclassi altri tipi come BindingList<T> o List<T> causerà solo dolore.

Una volta creata la sottoclasse Collection<T>, è possibile sovrascrivere Aggiungi e creare il proprio evento da ascoltare.

0

Il modo corretto per eseguire questa operazione è estendere Collection<T> e sovrascrivere il metodo InsertItem. Puoi sollevare il tuo evento lì prima di chiamare base.InsertItem.

0

Utilizzare la libreria di raccolte C5. Le raccolte di C5 sono già configurate per essere in grado di generare eventi in diverse operazioni, tra cui la rimozione della raccolta, l'aggiunta di elementi, la rimozione di elementi, l'inserimento di elementi e le modifiche generali alla raccolta.

Così, patrimonio librario C5 attuare le System.Collection.GenericICollection e IList interfacce eventualmente, e così può essere eliminato in quanto l'applicazione anche se una libreria è solo prevedendo, ad esempio un SCG.ICollection.

EDIT: Ho dimenticato di menzionare una parte delle vostre esigenze; molti degli eventi sopra menzionati sono eventi cancellabili e vengono attivati ​​prima che l'azione abbia influito sulla raccolta sottostante, consentendo di apportare modifiche o rifiutare aggiunte, rimozioni ecc.

-1

Utilizzare ObservableCollection. Ha eventi che monitorano quando la collezione sta cambiando. Credo che sia usato principalmente per WPF, ma l'ho usato anche con i progetti ASP.NET.

+1

... ObservableCollection (Of T) ... nello spazio dei nomi System.Collections.ObjectModel in WindowsBase.dll. – crazytmack

+0

ObservableCollection ha solo eventi post, ma la domanda si interroga sui pre-eventi. Dovresti ereditare da ObservableCollection e scavalcare i membri per ottenere il comportamento desiderato. –

Problemi correlati