using System;
namespace MyCollections
{
   using System.Collections;

   public delegate void ChangedEventHandler(object sender, EventArgs e);
   public class ListWithChangedEvent: ArrayList
   {
       public event ChangedEventHandler MyAdd;

       public event ChangedEventHandler MyClear;
      protected virtual void OnAdd(EventArgs e)
      {
          if (MyAdd != null)
              MyAdd(this, e);
      }
       protected virtual void OnClear(EventArgs e)
       {
           if (MyClear != null)
               MyClear(this, e);
       }

      public override int Add(object value)
      {
         int i = base.Add(value);
         OnAdd(EventArgs.Empty);
         return i;
      }

      public override void Clear()
      {
         base.Clear();
         OnClear(EventArgs.Empty);
      }
   }

   class Test
   {

      // This will be called whenever the list changes.
      public static void AddChanged(object sender, EventArgs e)
      {
         Console.WriteLine("This is called when the event fires.    Add");
      }

       public static void ClearChanged(object sender, EventArgs e)
       {
           Console.WriteLine("This is called when the event fires. Clear");
       }
      public static void Main()
      {
       ListWithChangedEvent list = new ListWithChangedEvent();
       list.MyAdd += new ChangedEventHandler(AddChanged);
       list.MyAdd += new ChangedEventHandler(AddChanged);
       list.MyClear += new ChangedEventHandler(ClearChanged);
       list.Add("item 1");
       list.Clear();
       list.Add("item 1");
       list.Clear();
    
      }
   }
}